2017-04-16 511 views
1

如何修復我的正則表達式模式以匹配以「X」開始並以「Z」開頭的每個單詞?正則表達式匹配所有以字符串開頭並以字符串結尾的單詞

代碼:

import re 

#input 
s = "xaz xazx xaxsza zsxdaszdx zasxz xaaz xaaaz" 

pattern1 = "x.*z" 
pattern2 = "\bx.*z\b" 
pattern3 = "x.*?z" 
pattern4 = "\b^x.*z$\b" 
pattern5 = "\Bx.*z\B" 
#also tried using \s, \S,^and $... 

re.findall(pattern, s) 

所需的輸出:

out = ["xaz", "xaaz", "xaaaz"] 

我怎樣才能做到這一點?

Regex Demo

回答

2

在你的模式有兩點要注意:

  • "x.*z" - 匹配x,那麼*多人行以外的任何字符儘可能多的向上突破至z
  • 最後一次出現"\bx.*z\b" - 一個退格符號,然後與上面相同,並且同樣是退格符號
  • "x.*?z" - 一個x,然後*到的z
  • "\b^x.*z$\b"第一發生比斷線以外的任何字符作爲儘可能向上 - 退格符號,隨後與串的開始,這已經是信令故障,任何0 +字符到z隨後與字符串的結尾,然後退格符號
  • "\Bx.*z\B" - 一個非單詞邊界,x,任何0+字符,直到最後z後面沒有一個字邊界。

您需要使用原始字符串文字,以便\b可以表示字邊界。

所以,你可以使用

s = "xaz xazx xaxsza zsxdaszdx zasxz xaaz xaaaz" 
pattern = r"\bx\w*z\b" 
print(re.findall(pattern, s)) 
# => ['xaz', 'xaaz', 'xaaaz'] 

Python demo

如果你想匹配的字母詞而已,用r"\bx[^\W\d_]*z\b"

模式演示

  • \b - 領先字邊界
  • x - 一個x
  • \w* - 0+字字符(字母/數字/ _)(該[^\W\d_]結構將匹配任何字母,數字和_都減去「雙負」結構)
  • z a z
  • \b - 尾隨字邊界。

注意,如果你只有用空格分開 「的話」,你可能得到的結果與

[x for x in s.split() if x.startswith('x') and x.endswith('z')] 

another demo

+0

完美,非常有幫助!感謝代碼和解釋!我正在學習正則表達式,這對我幫助很大! –

+1

請注意''\ b「'與'r'\ b」'不一樣,''\ B「'等於'r」\ B「'。在定義正則表達式模式時,在大多數情況下使用原始字符串文字。 –

1

正則表達式:\ BX \ S + Z \ b

演示:https://regex101.com/r/XuJybA/2

  1. 海RCH使用單詞邊界的話:\ b
  2. 看到字符串與X
  3. 然後匹配任何開始,除了空間\ S
  4. 並確保字與z結尾
+0

非常有趣!我試圖在我的腦海中實現這樣的目標......感謝您的幫助!順便說一句,似乎'\ BX \ S + Z \ B'也可以! –

+0

是的。我從頭腦開始考慮其他的東西,比如以相同字母開頭和結尾的單詞,糾正它:) –

相關問題