Сопоставьте вхождение, начинающееся с двух или трех цифр, но не содержащее где-либо определенного шаблона

#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. Потрясающе, спасибо, люди, я понял это и многому научился из ваших ответов. 🙂