如何修复我的正则表达式模式,以匹配以“ 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

07-28 02:18
查看更多