[英]python regex - optional match
我有一堆串這種味道的東西:
#q1_a1
#q7
基本上#是必須忽略的符號。 #后面是單字母字母和一些數字。 可選地,可以在_
(下划線)后跟隨一些字母+數字的組合。
這是我想出的:
>>> pat = re.compile(r"#(.*)_?(.+)?")
>>> pat.match('#q1').groups()
('q1', None)
問題是#q1_a1
格式的字符串。 當我將我制作的東西應用於這樣的字符串時:
>>> pat.findall('#q1_f1')
[('q1_f1', '')]
有什么建議么?
正如其他人所說,您的正則表達式越具體,匹配不該匹配的內容的可能性就越小:
In [13]: re.match(r'#([A-Za-z][0-9])(?:_([A-Za-z][0-9]))?', '#q1_a1').groups()
Out[13]: ('q1', 'a1')
In [14]: re.match(r'#([A-Za-z][0-9])(?:_([A-Za-z][0-9]))?', '#q1').groups()
Out[14]: ('q1', None)
筆記:
^
和$
包圍正則表達式。 [0-9]
更改為[0-9]+
。 您的“。*”匹配項也帶有下划線,因為匹配項很貪心。 更好地創建更具體的正則表達式,以將下划線排除在第一組之外。
正確的正則表達式可能如下所示:
#([a-z][0-9])_?([a-z][0-9])?
但您需要檢查它是否適用於您期望的所有數據。
附言 在正則表達式中更具體一些會更好,因為您的假陽性更少。
當您使用.*
,它會盡可能地貪婪地匹配。 嘗試:
>>> pat = re.compile(r"#([^_]*)_?(.+)?")
>>> pat.findall('#q1_f1')
[('q1', 'f1')]
同樣,最好寫一個更具體的表達式:
#([a-z][0-9])(?:_([a-z][0-9]))?
一個不使用正則表達式的簡單替代方法:
s = '#q7'
print s[1:].split('_')
# ['q7']
s = '#q1_a1'
print s[1:].split('_')
# ['q1', 'a1']
假設所有字符串都以#
開頭。 如果不是這種情況,那么您可以輕松地進行一些驗證:
s = '#q1_a1'
if s.startswith('#'):
print s[1:].split('_')
# ['q1', 'a1]
s = 'q1_a1'
if s.startswith('#'):
print s[1:].split('_') # Nothing is printed
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.