文字列の最後の桁は文字列のインデックスであるため、検出する必要があります。2 ^ 64である可能性があるため、文字列の最後の要素のみをチェックしてから2番目を試すのは便利ではありません...など。文字列は次のようasdgaf1_hsg534
になります。つまり、文字列には他の数字も含まれる場合がありますが、途中にあります。そして、それらは私が取得したいインデックスに隣接していません。
3 に答える
以下を使用する方法を次に示しますre.sub
。
import re
input = ['asdgaf1_hsg534', 'asdfh23_hsjd12', 'dgshg_jhfsd86']
for s in input:
print re.sub('.*?([0-9]*)$',r'\1',s)
出力:
534
12
86
説明:
関数は、、を取りregular expression
、あなたは次の場所で置換を行いますreplacement string
。string
re.sub(regex,replace,string)
正規表現'.*?([0-9]*)$'
は文字列全体と一致し、文字列の終わりの前にある番号をキャプチャします。括弧は、関心のある試合の一部をキャプチャするために使用され 、最初のキャプチャグループと2番目の電気ショック療法\1
を指します。\2
.*? # Matches anything (non-greedy)
([0-9]*) # Upto a zero or more digits digit (captured)
$ # Followed by the end-of-string identifier
したがって、文字列全体を、関心のあるキャプチャされた数値だけに置き換えます。Pythonでは、これに生の文字列を使用する必要がありますr'\1'
。文字列が数字で終わっていない場合は、空白の文字列が返されます。
twosixfour = "get_the_numb3r_2_^_64__18446744073709551615"
print re.sub('.*?([0-9]*)$',r'\1',twosixfour)
>>> 18446744073709551615
単純な正規表現では、文字列の最後にある数字を検出できます。
'\d+$'
$
文字列の終わりに一致します。\d+
1つ以上の数字に一致します。演算子はデフォルトで貪欲です。+
つまり、可能な限り多くの桁に一致します。したがって、これは文字列の最後にあるすべての数字と一致します。
使用re.sub
して、行末に少なくとも1桁の数字が存在することを確認する場合は、数量詞を使用して+
1つ以上の数字を照合し\d+
、数字が存在しないか数字がない場合に行全体を削除しないようにすることができます。行の終わりでのみ。
^.*?(\d+)$
^
行の開始.*?
改行を除くすべての文字を可能な限り一致させます(貪欲ではありません)(\d+)
グループ1をキャプチャし、1桁以上一致します$
行の終わり
またはネガティブルックビハインドを使用する
^.*(?<!\d)(\d+)$
^
行の開始.*
改行以外の任意の文字を可能な限り一致させます(?<!\d)(\d+)
直接左側に数字をアサートせず、グループ1の1つ以上の数字をキャプチャします$
行の終わり
re.matchを使用する場合は、^
アンカーを省略できます。また、 \A
andを使用して、文字列の開始と終了\Z
をアサートすることもできます。
import re
strings = ['asdgaf1_hsg534', 'asdfh23_hsjd12', 'dgshg_jhfsd86', 'test']
for s in strings:
print (re.sub(r".*?(\d+)$", r'\1',s))
出力
534
12
86
test
このコメントのように、数字を照合する前に数字以外の数字が存在する必要がある場合は、単一のキャプチャグループで否定された文字クラスを使用できます。
^.*[^\d\r\n](\d+)
^
行の開始.*
改行以外の任意の文字を可能な限り一致させます[^\d\r\n]
否定文字クラス。数字または改行以外の任意の文字に一致します(\d+)
グループ1をキャプチャし、1桁以上一致します
文字列の最後の桁を取得するには(必ずしも文字列の最後にある必要はありません)
^.*?(\d+)[^\r\n\d]*$
^
行の開始.*?
改行を除くすべての文字を可能な限り一致させます(貪欲ではありません)(\d+)
グループ1をキャプチャし、1桁以上一致します[^\r\n\d]*
否定文字クラス、改行または数字を除くすべての文字の0倍以上に一致$
行の終わり