簡體   English   中英

python3使用正則表達式解析字符串(包含“ *”)

[英]python3 parse string(contain '*') using regular expression

假設字符串具有這樣的pattern (\\d+)(X|Y|Z)(!|#)?
digits出現=> X or Y or Z出現=> ! or # ! or #並不總是出現。

我想解析字符串並想返回列表。

ex1)str = 238Z!32Z#11234X
我想返回[238Z !, 32Z#,11234X]

ex2)str = 91X92Y93Z
我想退貨[91X,92Y,93Z]

下面是我的代碼。

# your code goes here
import re

p=re.compile('^(\d+)(X|Y|Z)(!|#)?$')
L=p.findall("238Z!32Z!11234X")
print(L)

但我有空列表[]
我怎么了

不要在正則表達式中使用^$ ^匹配行首, $匹配行尾。 這意味着您的正則表達式將只匹配以行開頭和結尾的字符串。

import re

p=re.compile('(\d+)(X|Y|Z)(!|#)?')
L=p.findall("238Z!32Z!11234X")
print(L)

輸出:

[('238', 'Z', '!'), ('32', 'Z', '!'), ('11234', 'X', '')]

如果您不希望獲取元組,而是希望獲取匹配的整個字符串,請不要使用捕獲組:

p=re.compile('(?:\d+)(?:X|Y|Z)(?:!|#)?')

輸出:

['238Z!', '32Z!', '11234X']

首先, ^$是用於匹配字符串開頭和結尾(不是模式)的元字符 因此,您必須刪除它們,以便您的正則表達式可以找到所有相應的模式。

其次,如果您的模式包含至少一個,則findall函數將返回一組列表。 組由模式中的括號定義。 您應該使用非捕獲組 (?:...)

import re

p = re.compile('(?:\d+)(?:X|Y|Z)(?:!|#)?')
L = p.findall("238Z!32Z!11234X")
print(L)
# ['238Z!', '32Z!', '11234X']

編寫正則表達式時的另一條建議。 如果要匹配字符列表,則不需要(a|b|c) ,可以使用具有相同含義的[abc]

此外,如果要量化單個元素,則無需使用括號。 (\\d+)等效於\\d+ ,您將不再有任何組問題。

您的正則表達式將變為:

\d+[XYZ][!#]?

您不應使用^$錨,因為它們將要求您的字符串完全與一種模式匹配。

如果要獲得所需的結果,也不要使用捕獲組:

p=re.compile('\d+[XYZ][!#]?')

['238Z!','32Z!','11234X']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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