我正在學習Regular Expressions,所以對於一個簡單的問題表示歉意。正則表達式 - 如何選擇一個有' - '的單詞?
我想選擇有一個詞 - 它而不是在開始,而不是在單詞的末尾
我嘗試(使用的findAll)(減號)「」:
r'\b-\b'
爲
str = 'word semi-column peace'
但是,當然只得到了:
['-']
謝謝!
我正在學習Regular Expressions,所以對於一個簡單的問題表示歉意。正則表達式 - 如何選擇一個有' - '的單詞?
我想選擇有一個詞 - 它而不是在開始,而不是在單詞的末尾
我嘗試(使用的findAll)(減號)「」:
r'\b-\b'
爲
str = 'word semi-column peace'
但是,當然只得到了:
['-']
謝謝!
一個 ' - '(減號)中,但在開始時沒有和不是在字
結束由於"-"
是不一個字字符,則不能使用單詞邊界(\b
)防止在開始或結束時使用帶連字符的單詞進行匹配。像"-not-wanted-"
這樣的字符串將匹配\b\w+-\w+\b
和\w+-\w+
。
我們需要前後單詞後多加一個條件:
(?<![-\w])
沒有任何一個連字號,也不是一個單詞字符開頭。(?![-\w])
沒有後跟連字符或單詞字符。此外,一個詞可能有超過1個連字符,我們需要允許它。我們可以在這裏做的是一次重複這個詞的最後部分(「字號和字字符」)或以上:
\w+(?:-\w+)+
比賽:
\w+
一個或多個單詞字符(?:-\w+)+
一連字符和一個或多個單詞字符,並允許重複最後一部分。正則表達式:
(?<![-\w])\w+(?:-\w+)+(?![-\w])
代碼:
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)
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']
的解釋總是歡迎:) –
@LetzerWilie - 謝謝!如果不是用詞來表達:「2.2 -3.5-beta」?它會工作嗎(意思是,正則表達式會忽略這個表達)?另外,詞的定義(從我收集的內容)可以稍微改變一個正則表達式實現到另一個。有沒有辦法解決這個問題? – Toly
你可以試試這樣:以連字符爲中心,我匹配,直到從連字符的任一方向出現一個空格爲止,我也檢查這些單詞是否被連字符包圍(例如-test-cats- ),如果他們是我確保不包括他們。正則表達式也應該與findall一起使用。
st = 'word semi-column peace'
m = re.search(r'([^ | ^-]+-[^ | ^-]+)', st)
if m:
print m.group(1)
另一種創造性的方法!謝謝你們! – Toly
您也可以使用下面的正則表達式:
>>> st = "word semi-column peace"
>>> print re.findall(r"\S+\-\S+", st)
['semi-column']
我好地方來測試真正的正則表達式,而不必運行的代碼是http://pythex.org/ – reticentroot