Regex để lọc tiếng Việt

Mọi người có thể hướng dẫn cho mình kiểm tra 1 chuỗi có thuộc dạng này không bằng regex với:

Chuỗi có dạng:
1 chữ cái là chữ thường:
2 là chữ tiếng việt
3 có thể có số
4 có thể có underscore

Mình mới làm được đến đây:

[\x5F]+|[a-z]|[0-9]

đoạn này theo mình hiểu là kiểm tra được chuỗi có số 0-9, a-z, theo bảng tiếng anh, và kí tự underscore, trong tiếng viết còn nhiếu ký tự khác nữa, nhưng mình chưa biết lọc thế nào.

ngoài ra cho mình hỏi thêm sự khác nhau của cái này và cái trên nữa:

[\x5F]+[a-z][0-9]

Tks you :slight_smile:

1 Like

chắc liệt kê đầy đủ ký tự tiếng Việt ra =]

3 Likes

:slight_smile: có cách nào khác nữa không tiền bối

1 Like

ko rõ :V Unicode tiếng Việt đâu có theo quy luật nào hay nằm liền kề nhau

http://vietunicode.sourceforge.net/charset/ hình như có 134 ký tự à chịu khó copy đi mất 5 phút chứ mấy =] Còn hơn ngồi mò chắc cả tiếng =]]

https://stackoverflow.com/questions/37579692/unicode-range-for-vietnamese có copy sẵn luôn nè
edit: từ http://vietunicode.sourceforge.net/charset/vietalphabet.html:

aAàÀảẢãÃáÁạẠăĂằẰẳẲẵẴắẮặẶâÂầẦẩẨẫẪấẤậẬbBcCdDđĐeEèÈẻẺẽẼéÉẹẸêÊềỀểỂễỄếẾệỆ
fFgGhHiIìÌỉỈĩĨíÍịỊjJkKlLmMnNoOòÒỏỎõÕóÓọỌôÔồỒổỔỗỖốỐộỘơƠờỜởỞỡỠớỚợỢpPqQrRsStTu
UùÙủỦũŨúÚụỤưƯừỪửỬữỮứỨựỰvVwWxXyYỳỲỷỶỹỸýÝỵỴzZ
U+0041-U+005A, U+0061-U+007A, U+00C0-U+00C3, U+00C8-U+00CA,
U+00CC-U+00CD, U+00D2-U+00D5, U+00D9-U+00DA, U+00DD, 
U+00E0-U+00E3, U+00E8-U+00EA, U+00EC-U+00ED, U+00F2-U+00F5,
U+00F9-U+00FA, U+00FD, U+0102-U+0103, U+0110-U+0111,
U+0128-U+0129, U+0168-U+0169, U+01A0-U+01A1, U+01AF-U+01B0,
U+1EA0-U+1EF9

kỹ hơn nữa thì thêm mấy glyph gôm chữ và dấu như ô + dấu sắc :V
kỹ kỹ hơn nữa :V :V :V thì thêm mấy glyph gồm chữ tiếng Anh + mũ + thanh :V như “o + mũ ^ + sắc” :V :V :V ko biết “o + sắc + mũ” có hợp lệ ko nhỉ @_@

4 Likes

em cần lowercase thôi nên giảm được :v , nãy giờ là em đang copy đấy.

1 Like

trong cái bảng ở trang vietunicode nó có đầy đủ hêt rồi hay sao, ố nó cũng có. mà sao tiền bối thích dùng mã UNICODE thế, em thích dùng cái ASCII hơn

1 Like

cái \u dài quá với lại ko thấy ký tự đó là gì =]

2 Likes

em tưởng \x là đại diện cho mã hex

1 Like

nhưng em đâu biết chuỗi đó có encoding gì :V utf-16 hay utf-8 :V

\x là em dò theo encoding. \u là em dò theo code point. \u thì utf-8 hay utf-16 nó cũng dò đúng :V nếu regex có support Unicode

4 Likes

nếu truyền cái mã U+0041 thì thêm gì để print ra được tiếng việt vậy ạ

1 Like

trong Python ghi là '\u0041' :V

>>> '\u0041'
'A'
>>> '\u1ef5'
'ỵ'

hình như nó cho xài \u range luôn đó ví dụ '[\u0030-\u0039]' là tương đương với '[0-9]' :V

4 Likes

vâng ạ, quy luật thì em tìm sau vậy, cứ liệt kê trước đã

1 Like
\u00E0\u00E1\u00E2\u00E3\u00E8\u00E9\u00EA\u00EC\u00ED\u00F2\u00F3\u00F4\u00F5\u00F9
\u00FA\u00FD\u00E5\u0111\u0123\u0169\u01A1\u01B0\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB
\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5
\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF
\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9abcdefghiklmnopqrstuvxy0123456789_'

101 kí tự thường tiền bối ạ, không biết có thiếu không

2 Likes

copy hết ký tự thường lẫn in hoa vào Python s = ‘…’ rồi gõ s[::2] là nó in ra chữ thường hết mà :V

>>> s = 'aAàÀảẢãÃáÁạẠăĂằẰẳẲẵẴắẮặẶâÂầẦẩẨẫẪấẤậẬbBcCdDđĐeEèÈẻẺẽẼéÉẹẸêÊềỀểỂễỄếẾệỆfFgGhHiIìÌỉỈĩĨíÍịỊjJkKlLmMnNoOòÒỏỎõÕóÓọỌôÔồỒổỔỗỖốỐộỘơƠờỜởỞỡỠớỚợỢpPqQrRsStTuUùÙủỦũŨúÚụỤưƯừỪửỬữỮứỨựỰvVwWxXyYỳỲỷỶỹỸýÝỵỴzZ'
>>> s[::2]
'aàảãáạăằẳẵắặâầẩẫấậbcdđeèẻẽéẹêềểễếệfghiìỉĩíịjklmnoòỏõóọôồổỗốộơờởỡớợpqrstuùủũúụưừửữứựvwxyỳỷỹýỵz'

rồi thêm 0-9_ vào thôi :V :V

4 Likes

mà sao đoạn này nó không match vậy anh:

b = "b\u1edfi_v\u1eady"
regex = re.compile(r'\u00E0\u00E1\u00E2\u00E3\u00E8\u00E9\u00EA\u00EC\u00ED\u00F2\u00F3\u00F4\u00F5\u00F9\u00FA\u00FD\u00E5\u0111\u0123\u0169\u01A1\u01B0\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9abcdefghiklmnopqrstuvxy0123456789_')
match = re.search(regex,b)
if match is None:
	print("FALSE")
else :
	print("TRUE")
1 Like

thiếu dấu [] rồi :V

làm cái string vậy đi để \u làm gì :V

r'[aàảãáạăằẳẵắặâầẩẫấậbcdđeèẻẽéẹêềểễếệfghiìỉĩíịjklmnoòỏõóọôồổỗốộơờởỡớợpqrstuùủũúụưừửữứựvwxyỳỷỹýỵz0-9_]+'
b = "b\u1edfi_v\u1eady"
regex = re.compile(r'[aàảãáạăằẳẵắặâầẩẫấậbcdđeèẻẽéẹêềểễếệfghiìỉĩíịjklmnoòỏõóọôồổỗốộơờởỡớợpqrstuùủũúụưừửữứựvwxyỳỷỹýỵz0-9_]+')
match = re.search(regex, b)
print(match)
<_sre.SRE_Match object; span=(0, 7), match='bởi_vậy'>

chuỗi b kia cũng viết bình thường đi viết \u chi cho khó đọc vậy :V

4 Likes

em nghĩ phải \u nó mới match, vừa em ghi [] trong cái ‘’ bao sao không được, ngồi code lấu lú hết cả người

1 Like

\u là để lưu file ascii ko encode thôi em lưu file encode utf-8 rồi sợ gì nữa mà ko xài thẳng tiếng Việt =]

3 Likes

sao em không có cái + ở cuối mà nó vẫn match vậy anh :frowning:

1 Like

chắc nó match 1 ký tự :V Em chưa học kỹ hướng dẫn sử dụng regex trước khi dùng sao dám xài :V :V

ko có dấu + đây

<_sre.SRE_Match object; span=(0, 1), match='b'>

+ là match 1 hoặc nhiều hơn 1 ký tự, ko có thì nó match 1 ký tự

Python re nó có hàm findall nè:

b = "bởi vậy"
regex = re.compile(r'[aàảãáạăằẳẵắặâầẩẫấậbcdđeèẻẽéẹêềểễếệfghiìỉĩíịjklmnoòỏõóọôồổỗốộơờởỡớợpqrstuùủũúụưừửữứựvwxyỳỷỹýỵz0-9_]+')
matches = re.findall(regex, b)
print(matches)

output

['bởi', 'vậy']
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?