2016-11-17 9 views
1

数字の後ろに/ tcpまたは/ udpのいずれかを指定する方法はありますか?Pythonの正規表現の後ろに文字列または何も指定しないでください。

次の3つのシナリオを示しています入力 - >結果

  1. 123/tcp_haha - > 123
  2. 123 - > 123
  3. 123ABC/TCP - >不一致

iはre.compile(r'(\d+)(?:\/[tcpud]{3})*')を使用しますが、それはまた、場合にマッチした3

EDIT: はそれがだと思います本当にフォローアップの質問:どのように/ tcpか/ udpか、またはtcp/or/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

文字クラスは、その含まれている文字の任意の組み合わせに一致します。代わりに論理ORを使用する必要があります。

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

?:は(非サフィックスの例のために)あなたの非キャプチャグループはオプションになります非キャプチャグループ表記と?です。

何かが/tcp次の正規表現を使用することができ続く場合は、文字列をキャプチャしたい場合:

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

をデモ:https://regex101.com/r/oUm0e9/1

+0

返信いただきありがとうございます!私はちょうど/ tcpの後に何かがあっても番号を捕捉したいと思って、投稿を更新しました。それを達成する方法は?もう一度ありがとう – totoro

+0

@dragon_cat編集をチェックアウトします。 – Kasramvd

+0

こんにちは@kas返信いただきありがとうございます。私はあなたが一見を持つことができれば、フォローアップの質問は素晴らしいだろうと付け加えた。それがあまりにも関与すれば、私はそれを別の質問に移します。 – totoro

0

使用this regexあなたの編集後:

\d+(?=\/tcp|\/udp) 
  • \d+は、1つ以上の数字と一致します
  • (?=...)が先読みで次の文字がある場合、試合が停止します...
  • \/tcp|\/udpは、あなたの元の問題のためtcpまたはudpこのことについてどのよう
+0

!それ以外の場合はすべての数字に一致する(ケース2) – totoro

1

続くスラッシュと一致します。

^\d+(?=/tcp|/udp|$) 
関連する問題