使用re.findall()在包含+和-的字符串中匹配单词的正则表达式

0 投票
2 回答
3205 浏览
提问于 2025-04-18 09:44

我的正则表达式是 r"\babcb\"

mystr = "sdf ddabc"

mystr1 = "sdf abc"

print(re.findall(myreg,mystr))=[]

print(re.findall(myreg,mystr1))=[abc]

到现在为止,一切都按预期工作,但如果我把我的正则表达式和字符串改成这样。

myreg = r"\b\+abcb\"

mystr = "sdf +abc"

print(re.findall(myreg,mystr)) = [] but i would like to get [+abc]

我注意到使用以下内容可以正常工作。

   myreg = "^\\+abc$"

   mystr = "+abc"   

   mystr1 = "-+abc"

我的问题是:有没有办法在不拆分字符串的情况下,达到和上面一样的结果?

最好的祝福,

加布里埃尔

2 个回答

0

有两个问题

  1. 在你的 + 前面,也就是 +abc 的前面,没有单词边界,所以 \b 匹配不到。
  2. 你的正则表达式 \b\+abcb\ 试图在 abc 后面匹配一个字母 b(这是个笔误)。

单词边界

单词边界 \b 是在一个单词字符(字母、数字和下划线)和一个非单词字符(或者行的开始或结束)之间的一个位置。例如,在 +a 之间就有一个单词边界。

解决方案:自己定义边界

如果你想匹配 +abc,但只在它前面没有单词字符的情况下(比如,你不想在 def+abc 里面匹配),那么你可以用一个向后查找来自己定义边界:

(?<!\w)\+abc

这段代码的意思是“如果 +abc 前面没有单词字符(字母、数字、下划线),就匹配它。”

0

你的问题是这样的:

  • \b 是用来表示一个 \w\W 字符之间的边界(或者反过来)。
  • \w 包含的字符有 [a-zA-Z0-9_],也就是字母、数字和下划线。
  • \W 包含的字符是 [^a-zA-Z0-9_],这意味着除了 [a-zA-Z0-9_] 之外的所有字符。

因为 '+' 不在 \w 的范围内,所以你无法匹配空格和 '+' 之间的边界。

如果你想要达到你的目的,应该把你模式中的第一个 \b 去掉:

import re

string = "sdf +abc"
pattern = r"\+abc\b"
matches = re.findall(pattern, string)

print matches
['+abc']

撰写回答