В вашем регулярном выражении есть две проблемы.
- У вас есть
.*
, который жадно захватывает все, и будет изо всех сил, что исчерпает любую из последовательностей 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