簡體   English   中英

正則表達式匹配大寫/特殊/ unicode /越南字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM