Вложенные и смешанные взгляды и взгляды за плечами? - PullRequest
0 голосов
/ 08 сентября 2018

Например, я определяю "ключевое слово foo рядом с началом строки" как это регулярное выражение:

(?<=^.{,10})foo

И я определяю «короткую строку» как это регулярное выражение (или, что то же самое, 30 символов или меньше):

^(?=.{,30}$)

Теперь вопрос в том, что я хочу сопоставить «ключевое слово foo около начала короткой строки» с одним единственным регулярным выражением, но не уверен, как это сделать. Соответствующий текст должен быть "foo", поэтому предполагается, что окружающий текст будет обрабатываться должным образом (с поиском обходных путей).

Это то, что я пробовал, и оно, очевидно, не работает:

^(?=.{0,30)$)(?<=^.{,10})foo

Этот работает, но соответствует слишком большому количеству текста, я хочу только foo , а не aafoo :

^(?=.{0,30)$).{,10}foo

Ожидаемые входы и выходы:

aaaaaaaaaaa => None
aafooaaaaaa => "foo" (at position 2-5)
aaaaaaaaaaafoo => None (Too far from start of string)
aafooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa => None (String too long)

Я использую сторонний пакет PyPI regex (не встроенный re) на Python 3.

1 Ответ

0 голосов
/ 08 сентября 2018

Внутри lookbehind, когда вы сопоставляете начало строки с ^, используйте lookahead, чтобы убедиться, что конец строки находится на расстоянии менее 30 символов, чтобы не потреблять никаких символов в lookbehind - затем вы можете использовать до 10 символов в виде сзади, чтобы добраться до foo.Вы можете использовать шаблон

(?<=^(?=.{0,30}$).{,10})foo

См .:

pattern = r'(?<=^(?=.{0,30}$).{,10})foo'

# matches
print(regex.search(pattern, 'text foo text'))

# fails, foo is more than 10 characters away from the start of the string:
print(regex.search(pattern, 'text text text foo text'))

# fails, string is more than 30 characters long:
print(regex.search(pattern, 'text foo text long long string long long string long long string long long string'))

Выход:

<regex.Match object; span=(5, 8), match='foo'>
None
None
...