Как перебирать символы с помощью регулярных выражений? - PullRequest
1 голос
/ 30 апреля 2019

У меня есть строка s1, и я хочу найти все подходящие строки, которые начинаются с ABC и заканчиваются BCD: Вот что я пробовал, он вернет ['ABCDDDCECCCBCDABCVVVBCD']

Но то, что я хочу, это: ABCDDDCECCCBCD, ABCVVVBCD на самом деле есть две последовательности строк совпадения Как мне этого добиться? Спасибо !!

   s1='AABCDDDCECCCBCDABCVVVBCD'
    t1 ='ABC.*BCD'
    t2 = 'ABC.*CEC'

Я хочу получить всю строку, которая соответствует условию начала с конца ABD в BCD и начала с ABC и в CEC. Таким образом, ожидаемый результат ABCDDDCEC, ABCVVVBCD не должен возвращать ABCDDDCECCCBCD

1 Ответ

3 голосов
/ 30 апреля 2019

В вашем регулярном выражении есть две проблемы.

  • У вас есть .*, который жадно захватывает все, и будет изо всех сил, что исчерпает любую из последовательностей ABCsomethingBCD
  • У вас есть $ конец привязки строки, который заставляет строку соответствовать до конца строки.

Вы можете использовать это регулярное выражение, где совпадение начинается с ABC, а затем захватывает как можно меньше с помощью не жадного регулярного выражения .*?, затем сопоставляется BCD и, поскольку нет символа $, оно не получает вынужден совпадать до конца строки. Обратите внимание, что даже если вы измените .* на .*? и не удалите $ из регулярного выражения, вы все равно получите только один матч до конца строки, и это потому, что .*? вынужден совпадать до конца строки так как в регулярном выражении присутствует $ символ. Исправление, которое делает поведение, как ожидалось.

ABC.*?BCD

Python demo,

import re

s1='AABCDDDCECCCBCDABCVVVBCD'
t1 ='ABC.*?BCD'
re.findall(t1,s1)

печать

['ABCDDDCECCCBCD', 'ABCVVVBCD']

В случае, если ваша строка AABCDDDCECCCABCVVVBCD и вы не хотите совпадать со вторым ABC в строке до BCD, вы можете использовать этот жадный жадный жетон * Регулярное выражение 1036 *,

ABC(?:(?!ABC).)*BCD

Regex Demo

Редактировать 2: Для данной строки как AABCDDDCECCCABCVVVBCD вы хотите получить эти два совпадения в соответствии с вашим сообщением,

ABCDDDCEC and ABCVVVBCD

Вы можете использовать это регулярное выражение,

ABC.*?(?:CEC|BCD)

Regex Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...