如何修复我的正则表达式模式,以匹配以“ 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
最佳答案
关于您的模式的几点注意事项:"x.*z"
-匹配x
,然后*直到最后一次出现z
时,除换行符外的所有其他字符应尽可能多"\bx.*z\b"
-一个退格符号,与上面相同,再一次是一个退格符号"x.*?z"
-一个x
,然后*除换行符外的任何其他字符,在首次出现z
之前应尽可能少"\b^x.*z$\b"
-退格符号,后跟字符串的开头,这已经表明发生了故障,直到z
的所有0+字符都跟在字符串的末尾,然后是退格符号"\Bx.*z\B"
-一个非单词边界,x
,直到最后一个z
后面没有单词边界的任何0+字符。
您需要使用原始字符串文字,以便\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
一个z
\b
-尾部单词边界。请注意,如果仅用空格分隔“单词”,则可能会得到以下结果:
[x for x in s.split() if x.startswith('x') and x.endswith('z')]
见another demo