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

时间:2017-04-16 21:35:53

标签: python regex list word-boundary

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

2 个答案:

答案 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

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