使用re.findall()在包含+和-的字符串中匹配单词的正则表达式
我的正则表达式是 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
有两个问题
- 在你的
+
前面,也就是+abc
的前面,没有单词边界,所以\b
匹配不到。 - 你的正则表达式
\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']