2017-04-16 154 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

是的。我从头脑开始考虑其他的东西,比如以相同字母开头和结尾的单词,纠正它:) –

相关问题