[英]Regex to match capital/special/unicode/vietnamese characters
我正面临一个问题。 实际上,我使用越南文本,我想找到包含大写字母(大写字母)的每个单词。 当我使用're'模块时,我的函数(temp)不会像“Đà”那样捕捉到单词。 另一种方式(temp2)是一次检查每个字符,它可以工作,但它很慢,因为我必须将句子分成单词。
因此,我想知道是否有一种“重新”模块可以捕获所有特殊的大写字母。
我有两种方式:
def temp(sentence):
return re.findall(r'[a-z]*[A-Z]+[a-z]*', sentence)
lis=word_tokenize(sentence)
def temp2(lis):
proper_noun=[]
for word in lis:
for letter in word:
if letter.isupper():
proper_noun.append(word)
break
return proper_noun
输入:
'nous avons 2 Đồng et 3 Euro'
预期产量:
['Đồng','Euro']
谢谢!
你可以使用这个正则表达式:
\b\S*[AĂÂÁẮẤÀẰẦẢẲẨÃẴẪẠẶẬĐEÊÉẾÈỀẺỂẼỄẸỆIÍÌỈĨỊOÔƠÓỐỚÒỒỜỎỔỞÕỖỠỌỘỢUƯÚỨÙỪỦỬŨỮỤỰYÝỲỶỸỴAĂÂÁẮẤÀẰẦẢẲẨÃẴẪẠẶẬĐEÊÉẾÈỀẺỂẼỄẸỆIÍÌỈĨỊOÔƠÓỐỚÒỒỜỎỔỞÕỖỠỌỘỢUƯÚỨÙỪỦỬŨỮỤỰYÝỲỶỸỴAĂÂÁẮẤÀẰẦẢẲẨÃẴẪẠẶẬĐEÊÉẾÈỀẺỂẼỄẸỆIÍÌỈĨỊOÔƠÓỐỚÒỒỜỎỔỞÕỖỠỌỘỢUƯÚỨÙỪỦỬŨỮỤỰYÝỲỶỸỴAĂÂÁẮẤÀẰẦẢẲẨÃẴẪẠẶẬĐEÊÉẾÈỀẺỂẼỄẸỆIÍÌỈĨỊOÔƠÓỐỚÒỒỜỎỔỞÕỖỠỌỘỢUƯÚỨÙỪỦỬŨỮỤỰYÝỲỶỸỴAĂÂÁẮẤÀẰẦẢẲẨÃẴẪẠẶẬĐEÊÉẾÈỀẺỂẼỄẸỆIÍÌỈĨỊOÔƠÓỐỚÒỒỜỎỔỞÕỖỠỌỘỢUƯÚỨÙỪỦỬŨỮỤỰYÝỲỶỸỴAĂÂÁẮẤÀẰẦẢẲẨÃẴẪẠẶẬĐEÊÉẾÈỀẺỂẼỄẸỆIÍÌỈĨỊOÔƠÓỐỚÒỒỜỎỔỞÕỖỠỌỘỢUƯÚỨÙỪỦỬŨỮỤỰYÝỲỶỸỴA-Z]+\S*\b
@Rizwan M.Tuman的回答是正确的。 我想与您分享三个函数执行速度为100,000个句子。
lis=word_tokenize(sentence)
def temp(lis):
proper_noun=[]
for word in lis:
for letter in word:
if letter.isupper():
proper_noun.append(word)
break
return proper_noun
def temp2(sentence):
return re.findall(r'[a-z]*[A-Z]+[a-z]*', sentence)
def temp3(sentence):
return re.findall(capital_letter,sentence)
通过这种方式:
start_time = time.time()
for k in range(100000):
temp2(sentence)
print("%s seconds" % (time.time() - start_time))
结果如下:
>>Check each character of a list of words if it is a capital letter (.isupper())
(sentence has already been splitted into words)
0.4416656494140625 seconds
>>Function with re module which finds normal capital letters [A-Z] :
0.9373950958251953 seconds
>>Function with re module which finds all kinds of capital letters :
1.0783331394195557 seconds
要匹配仅包含至少1个大写Unicode字母的1个以上字母块,您可以使用
import re, sys, unicodedata
pLu = '[{}]'.format("".join([chr(i) for i in range(sys.maxunicode) if chr(i).isupper()]))
p = re.compile(r"[^\W\d_]*{Lu}[^\W\d_]*".format(Lu=pLu))
sentence = 'nous avons 2 Đồng et 3 Ęułro.+++++++++++++++Next line'
print(p.findall(sentence))
# => ['Đồng', 'Ęułro', 'Next']
pLu
是使用unicodedata
动态构建的Unicode字母字符类模式。 它依赖于Python版本,使用最新版本来包含尽可能多的Unicode大写字母( 有关更多详细信息,请参阅此答案 )。 [^\\W\\d_]
是一个匹配任何Unicode字母的构造 。 因此,模式匹配任何0+ Unicode字母,后跟至少1个Unicode大写字母,然后具有任何0+ Unicode字母。
请注意,原始r'[az]*[AZ]+[az]*'
仅在此输入中找到Next
:
print(re.findall(r'[a-z]*[A-Z]+[a-z]*', sentence)) # => ['Next']
请参阅Python演示
要将单词作为整个单词进行匹配,请使用\\b
单词边界:
p = re.compile(r"\b[^\W\d_]*{Lu}[^\W\d_]*\b".format(Lu=pLu))
如果您想使用Python 2.x,请不要忘记使用re.U
标志来re.U
\\W
, \\d
和\\b
Unicode。 但是,建议使用最新的PyPi正则表达式库及其[[:upper:]]
/ \\p{Lu}
结构来匹配大写字母,因为它将支持最新的Unicode字母列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.