2016-11-17 4 views
1

Как совместить число, за которым следует сразу/tcp или/udp или ничего?номер совпадения python regex, за которым следует строка или ничего

следующее иллюстрирует 3 сценария: вход -> Результат

  1. 123/tcp_haha -> 123
  2. 123 -> 123
  3. 123abc/TCP -> Нет матча

я использовал re.compile(r'(\d+)(?:\/[tcpud]{3})*') но и сопоставляются в случае 3.

EDIT: Угадайте это на самом деле следующий вопрос: как сопоставить цифры, за которыми следуют/tcp или/udp, или продолжать с помощью tcp/или/udp или просто по себе? так

1. something else 123/tcp_haha --> 123 
2. 123 --> 123 
3. 123abc/tcp --> no match 
4. udp/123 something else --> 123 
5. tcp/123/tcp --> 123 

ответ

3

класс персонажа будет соответствовать любым комбинациям его включенным символов. Вместо этого вам нужно использовать логический ИЛИ.

r'^\d+(?:/tcp|/udp)?$' 

?: представляет собой группу обозначений, не захват и ? сделает вашу группу без захвата необязательно (за исключением случаев, не суффиксов).

Если вы хотите, чтобы захватить строку, если что-то вслед за /tcp вы можете использовать следующее регулярное выражение:

r'^\d+(?:/tcp.*|/udp)?$' 

Демо: https://regex101.com/r/oUm0e9/1

+0

Спасибо за ответ! я просто обновил сообщение, понимая, что я также хочу захватить число, даже если что-то следует за/tcp. как добиться этого? Еще раз спасибо – totoro

+0

@dragon_cat Оформить заказ. – Kasramvd

+0

привет, спасибо за ответ еще раз. Я добавил, что следующий вопрос был бы замечательным, если бы вы могли посмотреть. если он слишком вовлечен, я переведу его на отдельный вопрос. – totoro

0

Использование this regex после правки:

\d+(?=\/tcp|\/udp) 
  • \d+ соответствует одной или нескольким цифрам
  • (?=...) является опережения, матч остановится, если следующие символы ...
  • \/tcp|\/udp соответствует слэш с последующим tcp или udp
+0

благодарит за ответ! он работает, за исключением того, что не соответствует всем номерам (случай 2) – totoro

1

Как об этом для исходной задачи:

^\d+(?=/tcp|/udp|$) 
Смежные вопросы