正则表达式匹配字符串中以特定字符开头和结尾的所有单词
Regex to match all words that startswith and endswith specific characters in string
如何修复我的正则表达式模式以匹配以 "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"]
我怎样才能做到这一点?
关于您的模式的几点说明:
"x.*z"
- 匹配 x
,然后*除换行符外的任何字符尽可能多,直到最后一次出现 z
"\bx.*z\b"
- 退格符号,然后与上面相同,然后再次退格符号
"x.*?z"
- 一个 x
,然后 *除换行符之外的任何字符尽可能 很少 直到 第一个 出现 z
"\b^x.*z$\b"
- 退格符号后跟字符串的开头,这已经表示失败,z
之前的任何 0+ 个字符后跟字符串的结尾,然后退格符号
"\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']
如果您只想将单词与字母匹配,请使用 r"\bx[^\W\d_]*z\b"
。
模式演示:
\b
- 前导词边界
x
- 一个 x
\w*
- 0+ 个单词字符 (letters/digits/_
)([^\W\d_]
构造将匹配任何字母、数字和 _
被减去在 "double negative" 结构中)
z
一个z
\b
- 尾随单词边界。
请注意,如果您只有 "words" 用空格分隔,您可能会得到
的结果
[x for x in s.split() if x.startswith('x') and x.endswith('z')]
正则表达式:\bx\S+z\b
演示:https://regex101.com/r/XuJybA/2
- 使用单词边界搜索单词:\b
- 看到字符串以x开头
- 然后匹配除空格以外的任何内容 \S
- 并确保单词以 z
结尾
如何修复我的正则表达式模式以匹配以 "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"]
我怎样才能做到这一点?
关于您的模式的几点说明:
"x.*z"
- 匹配x
,然后*除换行符外的任何字符尽可能多,直到最后一次出现z
"\bx.*z\b"
- 退格符号,然后与上面相同,然后再次退格符号"x.*?z"
- 一个x
,然后 *除换行符之外的任何字符尽可能 很少 直到 第一个 出现z
"\b^x.*z$\b"
- 退格符号后跟字符串的开头,这已经表示失败,z
之前的任何 0+ 个字符后跟字符串的结尾,然后退格符号"\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']
如果您只想将单词与字母匹配,请使用 r"\bx[^\W\d_]*z\b"
。
模式演示:
\b
- 前导词边界x
- 一个x
\w*
- 0+ 个单词字符 (letters/digits/_
)([^\W\d_]
构造将匹配任何字母、数字和_
被减去在 "double negative" 结构中)z
一个z
\b
- 尾随单词边界。
请注意,如果您只有 "words" 用空格分隔,您可能会得到
的结果[x for x in s.split() if x.startswith('x') and x.endswith('z')]
正则表达式:\bx\S+z\b
演示:https://regex101.com/r/XuJybA/2
- 使用单词边界搜索单词:\b
- 看到字符串以x开头
- 然后匹配除空格以外的任何内容 \S
- 并确保单词以 z 结尾