簡體   English   中英

python regex-可選匹配

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

筆記:

  1. 如果只需要匹配整個字符串,則用^$包圍正則表達式。
  2. 您說“一些數字”,但是您的示例僅包含一個數字。 如果您的正則表達式需要接受多個數字,請將[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.

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