Подтвердить что ты не робот

Регулярное выражение: начало матча или пробелы

Может ли регулярное выражение соответствовать пробелу или началу строки?

Я пытаюсь заменить валюту аббревиатурой GBP символом £. Я мог бы просто соответствовать чему-либо, начиная с GBP, но я хотел бы быть немного более консервативным и искать определенные разделители вокруг него.

>>> import re
>>> text = u'GBP 5 Off when you spend GBP75.00'

>>> re.sub(ur'GBP([\W\d])', ur'£\g<1>', text) # matches GBP with any prefix
u'\xa3 5 Off when you spend \xa375.00'

>>> re.sub(ur'^GBP([\W\d])', ur'£\g<1>', text) # matches at start only
u'\xa3 5 Off when you spend GBP75.00'

>>> re.sub(ur'(\W)GBP([\W\d])', ur'\g<1>£\g<2>', text) # matches whitespace prefix only
u'GBP 5 Off when you spend \xa375.00'

Можно ли одновременно использовать оба последних примера?

4b9b3361

Ответ 1

Используйте оператор OR "|":

>>> re.sub(r'(^|\W)GBP([\W\d])', u'\g<1>£\g<2>', text)
u'\xa3 5 Off when you spend \xa375.00'

Ответ 2

\b - граница слова, которая может быть пробелом, началом строки или не буквенно-цифровым символом (\bGBP\b).

Ответ 3

Это заменяет GBP, если ему предшествует начало строки или граница слова (начало которой уже есть), а после GBP - числовое значение или граница слова:

re.sub(u'\bGBP(?=\b|\d)', u'£', text)

Это устраняет необходимость в ненужном обратном обращении с помощью lookahead. Вполне достаточно?

Ответ 4

Я думаю, что вы ищете '(^|\W)GBP([\W\d])'

Ответ 5

Да, почему бы и нет?

re.sub(u'^\W*GBP...

соответствует началу строки, 0 или более пробелов, затем GBP...

edit: О, я думаю, вам нужно чередование, используйте |:

re.sub(u'(^|\W)GBP...

Ответ 6

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

Ответ 7

Он работает в Perl:

$text = 'GBP 5 off when you spend GBP75';
$text =~ s/(\W|^)GBP([\W\d])/$1\$$2/g;
printf "$text\n";

Вывод:

$ 5 off when you spend $75

Обратите внимание, что я указал, что совпадение должно быть глобальным, чтобы получить все вхождения.

Ответ 8

Левая граница пробела - позиция в строке, которая является либо началом строки, либо сразу после символа пробела - может быть выражена с помощью

(?<!\S)   # A negative lookbehind requiring no non-whitespace char immediately to the left of the current position
(?<=\s|^) # A positive lookbehind requiring a whitespace or start of string immediately to the left of the current position
(?:\s|^)  # A non-capturing group matching either a whitespace or start of string 
(\s|^)    # A capturing group matching either a whitespace or start of string

Демо-версия Python 3:

import re
rx = r'(?<!\S)GBP([\W\d])'
text = 'GBP 5 Off when you spend GBP75.00'
print( re.sub(rx, r'£\1', text) )
# => £ 5 Off when you spend £75.00

Обратите внимание, что вы можете использовать \1 вместо \g<1> в шаблоне замены, поскольку нет необходимости в однозначной обратной ссылке, если за ней не следует цифра.