如何修复我的正则表达式模式以匹配每个以" 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"]
我怎样才能做到这一点?
答案 0 :(得分:2)
关于你的模式的几点说明:
"x.*z"
- 匹配x
,然后*除了换行符之外的任何字符尽可能多,直到最后一次出现z
"\bx.*z\b"
- 退格符号,然后与上面相同,再次是退格符号"x.*?z"
- x
,然后*除了换行符以外的任何字符为很少,直到{em>第一次出现{{ 1}} z
- 一个退格符号,后面是字符串的开头,它已经表示失败,任何0+字符到"\b^x.*z$\b"
后跟字符串结尾,然后是退格符号z
- 一个非字边界,"\Bx.*z\B"
,任何0 +字符,直至最后x
,后面没有字边界。您需要使用原始字符串文字,以便z
可以表示单词边界。
所以,你可以使用
\b
请参阅Python demo
如果您只想将字母与字母匹配,请使用s = "xaz xazx xaxsza zsxdaszdx zasxz xaaz xaaaz"
pattern = r"\bx\w*z\b"
print(re.findall(pattern, s))
# => ['xaz', 'xaaz', 'xaaaz']
。
模式演示:
r"\bx[^\W\d_]*z\b"
- 领先的单词边界\b
- x
x
- 0+单词字符(字母/数字/ \w*
)(_
构造将匹配任何字母,数字和[^\W\d_]
在“double”中减去否定“建设”_
一个z
z
- 一个尾随字边界。请注意,如果您只将“单词”用空格分隔,则可以使用
获得结果\b
请参阅another demo
答案 1 :(得分:1)
正则表达式:\ bx \ S + z \ b
演示:https://regex101.com/r/XuJybA/2