2016-10-05 75 views
0

我希望我的正則表達式能夠匹配任意後跟某些數字的隨機字符串 - 但是如果兩個匹配都是空的,我希望匹配失敗。我目前正在構建正則表達式,如下所示:匹配兩個組,但它們都不應該爲空

regex = u'^(.*)' 
if has_digits: regex += u'(\d*)' 
regex += ext + u'$' # extension group as in u'(\.exe)' 
rePattern = re.compile(regex, re.I | re.U) 

但這也匹配空白文件名(僅限擴展名)。不能換我的頭周圍像類似的問題:

額外的複雜性在於,第二組(數字)可能無法添加

所以有效:

abc%.exe 
123.exe 

如果has_digits爲真:

abc 123.exe # I want the second group to contain the 123 not the first one 

無效:.exe

+0

難道你不能用''替換'*'運算符嗎? –

+0

@FedericoPiazza否,因爲即使has_digits爲真,數字可能不存在 - 如果has_digits爲true,那麼第一個組是可選的_if_有一些數字 –

+0

您能顯示一些有效/無效的樣本匹配嗎? – anubhava

回答

2

正則表達式:

^(.*?)(\d+)?(?<=.)\.exe$ 

正回顧後保證有前延伸部分的至少一個字符。

Live demo

集成:

regex = '^(.*?)' 
if has_digits: regex += '(\d+)?' 
regex += '(?<=.)' + ext + '$' 
rePattern = re.compile(regex, re.I | re.U) 
+0

謝謝 - 這是什麼?在'(。*?)'中做?它是否相當於'(。*)?'?編輯:跟着你的鏈接 - 解釋所有:)讓我測試一下... –

+0

還是不太確定?是需要的 - 如果我省略它會吃掉數字? –

+1

'。*。''是一個不貪婪的點星量詞(它根本不消耗任何字符),而是(*。*),與(。*)?不同。 '是一個貪婪的點星形量詞,儘可能地消耗字符(數字不被第二組捕獲的原因)。通過將'?'追加到分組結構中,後者變得可選。 – revo

1

您可以使用此前瞻基於正則表達式:

ext = r'\.exe' 

regex = r'^(?=.+\.)(.*?)' 
if has_digits: regex += r'(\d*)' 
regex += ext + '$' 
rePattern = re.compile(regex, re.I | re.U) 
# ^(?=.+\.)(.*?)(\d*)\.exe$ 

RegEx Demo

先行(?=.+\.)確保在DOT之前至少存在一個字符。

+0

感謝 - 有趣的變化 - 只是@revo先到那裏:) –

+0

是的,這也有效。由於具有先行功能並且沒有可選組,因此速度稍快。 – anubhava

+0

哈哈感謝(這將是不公平的,但我可能會使用你的:)然後你使用'r'''只是讓我意識到:_不像標準C,所有無法識別的轉義序列保留在字符串不變,即反斜槓留在string_ - > https://docs.python.org/2/reference/lexical_analysis.html#string-literals中 –

相關問題