Почему мое регулярное выражение с границей слова терпит неудачу? - PullRequest
0 голосов
/ 01 октября 2018

Я бы хотел сопоставить число, положительное или отрицательное, возможно, со знаком валюты впереди.Но я не хочу что-то вроде PSM-9.Мой код:

test='AAA PCSK-9, $111 -3,33'
re.findall(r'\b-?[$€£]?-?\d+[\d,.]*\b', test)

Вывод: ['-9', '111', '3,33'] Может кто-нибудь объяснить, почему -9 соответствует?Заранее спасибо.

Редактировать: Я не согласен с какой-либо частью PCSK-9, это похоже на название продукта, а не на цифру.Итак, мой желаемый результат:

['111', '3,33']

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Граница слова совпадает между буквой K и тире.2 части после тире [$€£]?-? являются необязательными из-за вопросительного знака, и затем вы сопоставляете один или несколько раз цифру.Это приводит к совпадению -9

То, что вы можете использовать вместо границы слова, это утверждение, которое проверяет, является ли то, что находится до и после совпадения, символом без пробела \S с использованием отрицательного взгляда сзади инегативный взгляд.

(?<!\S)-?[$€£]?(\d+(?:[,.]\d+)?)(?!\S)

Regex demo | Python demo

0 голосов
/ 05 октября 2018

-9 сопоставляется, потому что - - это несловный символ, а S - это символ слова ... поэтому между ними есть межсловная граница \b, как вы указали в регулярном выражении.

0 голосов
/ 01 октября 2018

Это потому, что \b соответствует разрыву между K и -, словом и несловесным символом.Если вы хотите избежать совпадения -, если ему предшествует слово, вы можете использовать вместо него отрицательный lookbehind:

re.findall(r'[$€£]?(?:(?<!\w)-)?\d+[\d,.]*\b', test)

С вашим вводом образца это возвращает:

['9', '111', '3,33']

Демо:https://regex101.com/r/A66C5W/1

...