Слово соответствия RegEx в строке, содержащей + и - с использованием re.findall() Python

myreg = r"\babcb\"

mystr = "sdf ddabc"

mystr1 = "sdf abc"

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

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

До сих пор все работает как положено, но если я изменю свой reg и мой str на.

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 ответа

Есть две проблемы

  1. Перед вашим + в +abcнет границы слова, поэтому \b не может соответствовать.
  2. Ваше регулярное выражение \b\+abcb\ пытается соответствовать буквальному b символ после abc (опечатка).

Слово Границы

Граница слова \b соответствует в позиции между символом слова (буквы, цифры и подчеркивание) и несловесным символом (или началом или концом строки). Например, есть граница слова между + и a

Решение: создайте собственную границу

Если вы хотите соответствовать +abc но только когда ему не предшествует символ слова (например, вы не хотите его внутри def+abc), тогда вы можете сделать свою собственную границу с видом сзади:

(?<!\w)\+abc

Это говорит "матч +abc если ему не предшествует символ слова (буква, цифра, подчеркивание)".

Ваша проблема заключается в следующем:

  • \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']
Другие вопросы по тегам