2017-03-16 12 views
2

PythonスクリプトでRegexに問題が発生していますが、これは正直なことを理解したことがなく、まだ混乱していますが、このインスタンスでは必要と思います。ここに私の問題があります。以下はPython Regex Pattern Advice

私は、文字列として保存されている出力である:私は後で使用する変数に「ST0」を識別して保存しようとしています

cd /dev;ls | grep st 
[[email protected] ~]# cd /dev;ls | grep st 
nst0 
nst0a 
nst0l 
nst0m 
st0 
st0a 
st0l 
st0m 
stderr 
stdin 
stdout 
vhost-net 
[[email protected] dev]# 

この文字列から、しかし、より多くの結果があるかもしれません見つけなければならないst0だけではありません。この番号は、新しいデバイスがサーバに接続されると自動的に生成されます(したがって、st0、st1、st2が無限になり、すべての結果をタプルに保存します)

誰かが私にどのような正規表現パターンI最初の2文字として「st」を識別し、その後の数字を取得するために使用する必要がありますか?

おかげ

+0

、あなたは何を試してみましたか? 「最初の2人のキャラクター」はどういう意味ですか?どこ? –

+0

最初の2文字は "st"を意味し、出力文字列のどこにコピーと貼り付けがあるのか​​を示します。 ['st'、 'st']を返すre.findall(r '\ bst \ b'、出力)を試しましたが、後で2文字を取得する方法はわかりません – Tolki

+0

're.findall(r '\ bst \ d + \ b '、出力) '残念なことに、これらのどちらも結果を返していないので、私は期待していました。あなたは、 'st \ d +'を意味するのであれば、 're.findall(r '(?m)^ st \ d + $'、output)' –

答えて

0

あなたは下の2つのソリューションのいずれかを使用することがあります。

re.findall(r'\bst\d+\b',output) 

regex demoを参照してください。ここでは、\bst\d+\bは、単語境界の間(文字列の開始/終了または単語以外の文字の間)にあるst + 1つ以上の桁に一致します。

または、あなたが意味する場合st\d+は行全体である必要があり、

re.findall(r'(?m)^st\d+$',output) 

を使用するには、this regex demoを参照してください。ここでは、st\d+は、^$のアンカー((?m)、インラインre.MULTILINE修飾オプションのためにライン境界に一致する)のため、全体の行としてのみ一致します。

Python demo:だから

import re 

reg = r"\bst\d+\b" 
s = "Last login: Thu Mar 16 23:04:57 2017 from 16.29.4.112\ncd /dev;ls | grep st\n[[email protected] ~]# cd /dev;ls | grep st\nnst0\nnst0a\nnst0l\nnst0m\nst0\nst1\nst0a\nst0l\nst0m\nstderr\nstdin\nstdout \nvhost-net\n[[email protected] dev]#" 
res = re.findall(reg, s) 
print(res) 
# => ['st0', 'st1'] 
+0

残念なことにどちらのインスタンスもうまくいきませんでしたre.findall(r '\ bst0 \ b'、出力)を試してみても、文字列内の単語を正確に見つけようとしても、何も返さない – Tolki

+0

あなたの入力は投稿したものとは異なります。または、自分のコードを試していない。 –

+0

文字列検索中: cd/dev; ls | grep st [root @ modi〜]#cd/dev; ls | grepのST nst0 nst0a nst0l nst0m ST0 st0a st0l st0m stderrの 標準入力、標準出力 のvhost-netの [ルート@のMODI devの]# – Tolki