2013-04-11 78 views
0

我有一個非常具體的正則表達式請求。我需要匹配的字符串三合一正則表達式

  • 含有 「M_」
  • 含有 「phys_」(在 「M_」 總有一些字符),
  • 在 「形」 的結局。

當僅使用正則表達式這似乎很好地工作在第一和最後一個標準:

^.*m_.*(?<!Shape)$ 

但是,當我說我失去了中間標準。

+2

正則表達式實現了什麼語言?你爲什麼試圖在一個正則表達式中執行三個任務,當你可以使用3個相當簡單的正則表達式? – zzzzBov 2013-04-11 22:03:58

+0

@zzzzBov:Python。在我的自制配置系統中,我也使用相同的正則表達式功能來處理各種其他事情。 (在這一點之前,它的工作非常出色,所以不要馬上更換它。) – 2013-04-11 22:06:48

+1

讓我保存這個問題。 當我們談論正則表達式(在理想情況下)時,我認爲編程語言並不那麼重要,爲什麼不用一個正則表達式解決問題呢?比使用'3合理簡單的正則表達式'更優雅。是的,我們應該考慮更多,但爲什麼不:) :) – Kovge 2013-04-11 22:09:41

回答

1

你想要的正則表達式是

^(?=.*m_)(?!.*phys_)(?!.*Shape$).*$ 

它將捕獲整個字符串,每個條件是在它自己的前瞻。您可以測試它並查看www.debuggex.com上正在發生的事情的可視化。

+1

盡我所能,這與我的回答有什麼不同? – georg 2013-04-11 22:43:18

+1

如果條件爲真,則要求匹配字符串的問題。您的答案只匹配空字符串。你的正則表達式也在物理條件中處理m_,這是多餘的。 – 2013-04-11 23:08:47

+0

@ thg435:雖然速度更快,但它更短,更重要! :) – 2013-04-12 06:48:09

2
import re 

r = re.compile(r'^(?=.*m_)(?!.*m_.+phys_)(?!.+Shape$)') 
print r.match("aaa") 
print r.match("aaa m_ xx") 
print r.match("aaa m_ xx Shape") 
print r.match("aaa m_ xx phys_ foo") 

基本上,其原理是:

^
    (?= .* should be there) 
    (?! .* should not be there) 
0

這可以用在Python正常的字符串的方法來實現(我加括號內爲清晰起見):

("m_" in input) and ("phys_" not in input) and (not input.endswith("Shape")) 

我解釋(總有一些字符後,「M_」)作爲一個暗示,「phys_」永不出現在「m_」的前面,而不是允許「phys_」出現在「m_」前面的情況通過。

+0

我想要一個正則表達式字符串,而不是python語句,因爲它是配置文件的一部分。 – 2013-04-12 06:24:12

+0

@JonasByström:下次將這個事實包含在你的問題中。在這種情況下,我認爲正則表達式不是一個好的解決方案,但是如果該工具不允許任何其他選項,那麼它會使您對正則表達式的請求成爲有效的請求。 – nhahtdh 2013-04-12 12:55:01