2015-10-14 64 views
2

我正在學習Regular Expressions,所以對於一個簡單的問題表示歉意。正則表達式 - 如何選擇一個有' - '的單詞?

我想選擇有一個詞 - 它而不是在開始,而不是在單詞的末尾

我嘗試(使用的findAll)(減號)「」:

r'\b-\b' 

str = 'word semi-column peace' 

但是,當然只得到了:

['-'] 

謝謝!

+0

我好地方來測試真正的正則表達式,而不必運行的代碼是http://pythex.org/ – reticentroot

回答

3

一個 ' - '(減號)中,但在開始時沒有不是在字

結束由於"-"一個字字符,則不能使用單詞邊界(\b)防止在開始或結束時使用帶連字符的單詞進行匹配。像"-not-wanted-"這樣的字符串將匹配\b\w+-\w+\b\w+-\w+


我們需要前後單詞後多加一個條件:

  • 之前:(?<![-\w])沒有任何一個連字號,也不是一個單詞字符開頭。
  • 之後:(?![-\w])沒有後跟連字符或單詞字符。

此外,一個詞可能有超過1個連字符,我們需要允許它。我們可以在這裏做的是一次重複這個詞的最後部分(「字號和字字符」)或以上:

  • \w+(?:-\w+)+比賽:
    • \w+一個或多個單詞字符
    • (?:-\w+)+一連字符和一個或多個單詞字符,並允許重複最後一部分。

正則表達式:

(?<![-\w])\w+(?:-\w+)+(?![-\w]) 

regex101 demo

代碼:

import re 

pattern = re.compile(r'(?<![-\w])\w+(?:-\w+)+(?![-\w])') 
text = "-abc word semi-column peace -not-wanted- one-word dont-match- multi-hyphenated-word" 

result = re.findall(pattern, text) 

ideone demo

+0

非常全面! – Toly

+0

正如任何正則表達式應該是:) – Mariano

+0

如果有表達式會發生什麼?例如,而不是「半列」有「2.0 - 3 -alpha」,這仍然工作(它會忽略表達)? – Toly

4
str is a built in name, better not to use it for naming 

st = 'word semi-column peace' 
# \w+ word - \w+ word after - 
print(re.findall(r"\b\w+-\w+\b",st)) 

['semi-column'] 
+3

的解釋總是歡迎:) –

+0

@LetzerWilie - 謝謝!如果不是用詞來表達:「2.2 -3.5-beta」?它會工作嗎(意思是,正則表達式會忽略這個表達)?另外,詞的定義(從我收集的內容)可以稍微改變一個正則表達式實現到另一個。有沒有辦法解決這個問題? – Toly

4

你真正想做的是像這樣的正則表達式:

\w+-\w+ 

這意味着什麼是找到一個字母數字字符至少一次指示由「+」的利用率,然後找到一個' - ',再次至少一次跟隨另一個字母數字字符,如'+'所示。

+0

謝謝!很好的解釋! – Toly

+0

非常歡迎! – idjaw

0

你可以試試這樣:以連字符爲中心,我匹配,直到從連字符的任一方向出現一個空格爲止,我也檢查這些單詞是否被連字符包圍(例如-test-cats- ),如果他們是我確保不包括他們。正則表達式也應該與findall一起使用。

st = 'word semi-column peace' 
m = re.search(r'([^ | ^-]+-[^ | ^-]+)', st) 
if m: 
    print m.group(1) 
+0

另一種創造性的方法!謝謝你們! – Toly

1

您也可以使用下面的正則表達式:

>>> st = "word semi-column peace" 
>>> print re.findall(r"\S+\-\S+", st) 
['semi-column']