#python #regex
#python #регулярное выражение
Вопрос:
У меня есть следующие строки:
12(3)/FO.2-3;1-2
153/G6S.3-H;2-3;1-2
1/G13S.2-3
22/FO.2-3;1-2
12(3)2S/FO.2-3;1-2
153/SH/G6S.3-H;2-3;1-2
45/3/H/GDP6;2-3;1-2
Я использую цифры, чтобы получить совпадение, если в начале строки я нахожу два или три числа, но не одно, также если поле содержит где-то выражения FO
, SH
, GDP
или LDP
я не должен считать это вхождением. Это означает, что из предыдущих строк get только 153/G6S.3-H;2-3;1-2
как совпадение, потому что в других либо содержится FO
, SH
, GDP
, либо в начале есть только одна цифра.
Я попытался использовать
^[1-9][1-9]((?!FO|SH|GDP).)*$
Я получаю правильный результат, но я не уверен, что это правильно, я не совсем разбираюсь в регулярных выражениях.
Ответ №1:
Вам нужно добавить любые другие символы, которые могут находиться между вашими начальными цифрами и тем, что вы хотите исключить:
Упрощенное регулярное выражение: ^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$
будет соответствовать только 153/G6S.3-H;2-3;1-2
вашим данным.
Объяснение:
^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$
----------- 2 to 3 digits or more at start of line
^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$
--------------------- any characters not matching (FO|SH|GDP|LDP)
^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$
--- match till end of line
(?:....)
Отрицательный внешний вид должен точно следовать, у вас есть другие символы между тем, что вы не хотите видеть, и вашим совпадением, следовательно, он его не улавливает.
См. https://regex101.com/r/j4SRoQ/1 для получения дополнительных пояснений (использования {2,}
).
Полный пример кода:
import re
regex = r"^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$"
test_str = r"""12(3)/FO.2-3;1-2
153/G6S.3-H;2-3;1-2
1/G13S.2-3
22/FO.2-3;1-2
12(3)2S/FO.2-3;1-2
153/SH/G6S.3-H;2-3;1-2
45/3/H/GDP6;2-3;1-2"""
matches = re.finditer(regex, test_str, re.MULTILINE)
for match in matches:
print(match.group())
Вывод:
153/G6S.3-H;2-3;1-2
Комментарии:
1. согласно его сообщению, я думаю, что он искал
{2,3}
not{2,}
. Но помимо этого это регулярное выражение выглядит очень похоже на то, о чем он просил.2. Потрясающе, спасибо, люди, я понял это и многому научился из ваших ответов. 🙂