接受 python 中所有泰文字符和英文字母的正则表达式

Regular Expression to accept all Thai characters and English letters in python

我需要矢量化泰语文本文档(例如 Bag of Words、doc2vec)。

首先,我想检查每个文档,省略除泰语字符和英文单词以外的所有内容(例如,没有标点符号、没有数字、除了撇号之外没有其他特殊字符)。

对于英文文档,我使用这个正则表达式: [^a-zA-Z' ]|^'|'$|''

对于泰文文档,我找不到合适的正则表达式来使用。我知道泰语的 Unicode 块是 u0E00–u0E7F。 我尝试了 [^ก-๛a-zA-Z' ]|^'|'$|'' 和许多其他组合,但没有成功。

例如: 我要

“真实的愿景宣布直播 2016/2017 - 2018/2019 赛季 3 年所有比赛的英超联赛,以及其他 5 个联赛,如西甲联赛、意甲联赛、意大利联赛和法甲联赛 1。最超值包裹通过手机和电视都可以,英文单词在这里!abc123"

成为:

“真实的愿景宣布自本赛季以来一年的所有英超联赛直播,以及其他著名联赛,如西班牙西甲联赛、意大利足球甲级联赛和法国甲级联赛,超值套餐。通过手机和电视,这里有一些英文单词 abc

在Python3,

s = "ทรูวิชั่นส์ ประกาศถ่ายทอดสดศึกฟุตบอล พรีเมียร์ ลีก อังกฤษ ครบทุกนัดเป็นเวลา 3 ปี ตั้งแต่ฤดูกาล 2016/2017 - 2018/2019 พร้อมด้วยอีก 5 ลีกดัง อาทิ ลา ลีกา สเปน, กัลโช เซเรีย เอ อิตาลี และลีกเอิง ฝรั่งเศส ภายใต้แพ็กเกจสุดคุ้ม ทั้งผ่านมือถือ และโทรทัศน์ some, English words here! abc123"
pattern = re.compile(r"(?:[^\d\W]+)|\s")
for each in pattern.findall(s): print(each, end="")

输出这个:

ทรวชนส ประกาศถายทอดสดศกฟตบอล พรเมยร ลก องกฤษ ครบทกนดเปนเวลา  ป ตงแตฤดกาล    พรอมดวยอก  ลกดง อาท ลา ลกา สเปน กลโช เซเรย เอ อตาล และลกเอง ฝรงเศส ภายใตแพกเกจสดคม ทงผานมอถอ และโทรทศน some English words here

正在删除口音,因此这不是一个完美的答案。我目前正在环顾四周,看看为什么会这样。

编辑:使用 HolyDanna 答案中的字符范围,您可以保留重音。有趣的是,仅使用 word 不会保留重音(这可能是由于 unicode 代码点如何在重音字符后添加重音作为另一个代码点,但似乎是一个错误)。它还具有从其他语言中删除字符的副作用。只需替换 HolyDanna 的编译行:

pattern = re.compile(r"[\u0E00-\u0E7Fa-zA-Z' ]")

如果不需要,可以去掉撇号(等)。

我将使用一些列表来完成我需要的事情。

首先,让我们创建模式:

pattern = re.compile(r"[^\u0E00-\u0E7Fa-zA-Z' ]|^'|'$|''")

我将使用一个名为 test_string 的字符串,其中包含您的示例:

test_string="ทรูวิชั่นส์ ประกาศถ่ายทอดสดศึกฟุตบอล พรีเมียร์ ลีก อังกฤษ ครบทุกนัดเป็นเวลา 3 ปี ตั้งแต่ฤดูกาล 2016/2017 - 2018/2019 พร้อมด้วยอีก 5 ลีกดัง อาทิ ลา ลีกา สเปน, กัลโช เซเรีย เอ อิตาลี และลีกเอิง ฝรั่งเศส ภายใต้แพ็กเกจสุดคุ้ม ทั้งผ่านมือถือ และโทรทัศน์ some, English words here! abc123"

首先,让我们在列表中获取要删除的字符:

char_to_remove = re.findall(pattern, test_string)

然后,让我们创建一个由原始字符串中的字符组成的列表,不包含这些字符:

list_with_char_removed = [char for char in test_string if not char in char_to_remove]

我们将这个列表转换成一个字符串,我们就完成了。

result_string = ''.join(list_with_char_removed)

结果是:

'ทรูวิชั่นส์ ประกาศถ่ายทอดสดศึกฟุตบอล พรีเมียร์ ลีก อังกฤษ ครบทุกนัดเป็นเวลา ปี ตั้งแต่ฤดูกาล พร้อมด้วยอีก ลีกดัง อาทิ ลา ลีกา สเปน กัลโช เซเรีย เอ อิตาลี และลีกเอิง ฝรั่งเศส ภายใต้แพ็กเกจสุดคุ้ม ทั้งผ่านมือถือ และโทรทัศน์ some English words here abc'

如果您有任何更简洁的方法来做任何 steps/any 问题,请不要犹豫!

遗憾的是,支持 Unicode 的正则表达式库并不多,Python 的 re 库就是其中之一。 Oniguruma 有适当的 Unicode 支持,我相信它有 Python 绑定,Perl 的内置正则表达式有很好的 Unicode 支持。

我通常不建议人们切换语言,但在这种情况下,使用 Perl 会省去很多麻烦(郑重声明,我有金 Python 徽章,而且避风港在过去的十年里接触过 Perl!)。这是它有多简单的味道(在 Oniguruma 中应该是一样的,我认为它有 Python 绑定):

[^\p{Latin}\p{Thai}]+

这是 Perl 示例代码:

#!/usr/bin/perl -w
use utf8;
$_ = "ทรูวิชั่นส์ ประ...abc123";
s/[^\p{Latin}\p{Thai}]+/ /g;
print;
print "\n";

这是输出:

ทรูวิชั่นส์ ประกาศถ่ายทอดสดศึกฟุตบอล พรีเมียร์ ลีก อังกฤษ ครบทุกนัดเป็นเวลา ปี ตั้งแต่ฤดูกาล พร้อมด้วยอีก ลีกดัง อาทิ ลา ลีกา สเปน กัลโช เซเรีย เอ อิตาลี และลีกเอิง ฝรั่งเศส ภายใต้แพ็กเกจสุดคุ้ม ทั้งผ่านมือถือ และโทรทัศน์ some English words here abc

在 Java 中,您可以将 Thai en English 的组合与: ^[\p{L}\p{javaUnicodeIdentifierPart}\p{Blank}\p{P}]*$

细分:

  • \p{L} 是一个 'normal' 字母
  • \p{javaUnicodeIdentifierPart} 匹配泰文字母
  • \p{Blank} 匹配一个 space 字符
  • \p{P} 匹配标点符号。

我不是泰语专家(除了我认识的),但没有标点符号匹配,字符串不匹配。

最简单的解决方案是使用正则表达式包。
Regex package 是 backwards-compatible 到 re.
pip install regex

import regex
m = regex.match('[\p{Latin}\p{Thai}]+', 'ทรูวิชั่นส์asdf')
m.captures()  # == ['ทรูวิชั่นส์asdf']