正则表达式匹配字符串中以特定字符开头和结尾的所有单词

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"] 

我怎样才能做到这一点?

Regex Demo

关于您的模式的几点说明:

  • "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']

Python demo

如果您只想将单词与字母匹配,请使用 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')]

another demo

正则表达式:\bx\S+z\b

演示:https://regex101.com/r/XuJybA/2

  1. 使用单词边界搜索单词:\b
  2. 看到字符串以x开头
  3. 然后匹配除空格以外的任何内容 \S
  4. 并确保单词以 z
  5. 结尾