28

私はPythonと正規表現(ここでは正規表現の初心者)にまったく慣れておらず、次の単純な文字列を持っています:

s=r"""99-my-name-is-John-Smith-6376827-%^-1-2-767980716"""

上記の文字列の最後の数字、つまり 767980716 のみを抽出したいのですが、python 正規表現を使用してこれをどのように達成できるか疑問に思っていました。

私は次の行に沿って似たようなことをしたかった:

re.compile(r"""-(.*?)""").search(str(s)).group(1)

「-」で始まり、文字列の最後で終わる (.*?) の間のものを見つけたいことを示していますが、これは何も返しません..

誰かが私を正しい方向に向けることができるかどうか疑問に思っていました..ありがとう。

4

7 に答える 7

39

re.match文字のみを検索するために使用できます。

>>> import re
>>> s=r"""99-my-name-is-John-Smith-6376827-%^-1-2-767980716"""
>>> re.match('.*?([0-9]+)$', s).group(1)
'767980716'

または、re.finditer同様に機能します。

>>> next(re.finditer(r'\d+$', s)).group(0)
'767980716'

すべての正規表現コンポーネントの説明:

  • .*?貪欲でない一致であり、可能な限り消費します (貪欲な一致は、最後の桁を除くすべてを消費します)。
  • [0-9]\dは、数字をキャプチャする 2 つの異なる方法です。後者は、୪ や ൨ など、他の書記体系の数字にも一致することに注意してください。
  • かっこ ( ()) は、式の内容をグループにして取得できますgroup(1)(または、2 番目のグループの場合は 2、一致全体の場合は 0)。
  • +複数のエントリ (最後に少なくとも 1 つの数字) を意味します。
  • $入力の末尾のみに一致します。
于 2012-11-22T19:21:20.340 に答える
8

素敵でシンプルfindall

import re

s=r"""99-my-name-is-John-Smith-6376827-%^-1-2-767980716"""

print re.findall('^.*-([0-9]+)$',s)

>>> ['767980716']

正規表現の説明:

^         # Match the start of the string
.*        # Followed by anthing
-         # Upto the last hyphen
([0-9]+)  # Capture the digits after the hyphen
$         # Upto the end of the string

または、より単純に、文字列の末尾に続く数字と一致するだけです '([0-9]+)$'

于 2012-11-22T19:21:58.030 に答える
7

あなたのRegexはずです(\d+)$

  • \d+数字 (1 つ以上) の照合に使用されます
  • $文字列の末尾に一致させるために使用されます。

したがって、コードは次のようになります。 -

>>> s = "99-my-name-is-John-Smith-6376827-%^-1-2-767980716"
>>> import re
>>> re.compile(r'(\d+)$').search(s).group(1)
'767980716'

また、すでに文字列であるため、strここで関数を使用する必要はありません。s

于 2012-11-22T19:20:42.887 に答える
4

より重い作業が必要な場合のために、正規表現を保存します。

>>> def parse_last_digits(line): return line.split('-')[-1]
>>> s = parse_last_digits(r"99-my-name-is-John-Smith-6376827-%^-1-2-767980716")
>>> s
'767980716'
于 2012-11-22T21:39:11.313 に答える
4

以下の正規表現を使用してください

\d+$

$文字列の終わりを示します。

\dは数字です

+直前の文字に 1 回以上一致する

于 2012-11-22T19:20:35.133 に答える
3

私はこれらのソリューションのいくつかを試してみましたが、文字列の末尾に数字がない場合、多くは失敗するようです。次のコードは機能するはずです。

import re

W = input("Enter a string:")
if re.match('.*?([0-9]+)$', W)== None:
    last_digits = "None"
else:
    last_digits = re.match('.*?([0-9]+)$', W).group(1)
print("Last digits of "+W+" are "+last_digits)
于 2020-04-25T03:59:52.573 に答える
2

\d+$代わりに使用してみてください。これは、1 つ以上の数字の後に文字列の末尾が続くものと一致します。

于 2012-11-22T19:20:58.140 に答える