web-dev-qa-db-ja.com

Python(正規表現)の数字を削除する

文字列からすべての数字を削除しようとしています。ただし、次のコードでは、Wordに含まれている数字も削除されます。明らかに、私はそれを望んでいません。私は多くの正規表現を試しましたが成功しませんでした。

ありがとう!


s = "This must not be deleted, but the number at the end yes 134411"
s = re.sub("\d+", "", s)
print s

結果:

これは削除してはいけませんが、最後の番号はあります

16
Menda

\ d +の前にスペースを追加します。

>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> s = re.sub(" \d+", " ", s)
>>> s
'This must not b3 delet3d, but the number at the end yes '

編集:コメントを見た後、私はより完全な答えを形成することにしました。これがすべての場合を説明していると思います。

s = re.sub("^\d+\s|\s\d+\s|\s\d+$", " ", s)
26
oneporter

これを試して:

"\b\d+\b"

これは、別の単語の一部ではない数字にのみ一致します。

14
jrcalzada

\sの使用は、タブなどを処理しないため、あまり良くありません。より良い解決策の最初のカットは次のとおりです。

re.sub(r"\b\d+\b", "", s)

\bは通常、文字列のバックスペースエスケープであり、代わりに特別なWord境界正規表現エスケープが必要なため、パターンは生の文字列であることに注意してください。少し凝ったバージョンは次のとおりです。

re.sub(r"$\d+\W+|\b\d+\b|\W+\d+$", "", s)

文字列の先頭/末尾に数字がある場合、先頭/末尾の空白を削除しようとします。私は「試行」と言います。なぜなら、最後に複数の数字がある場合でも、まだいくつかのスペースがあるからです。

5
dwc

行頭の数字列も処理するには:

s = re.sub(r"(^|\W)\d+", "", s)
3

番号が常に文字列の最後にある場合は、次を試してください:re.sub( "\ d + $"、 ""、s)

それ以外の場合は、re.sub( "(\ s)\ d +(\ s)"、 "\ 1\2"、s)を試すことができます。

後方参照を調整して、スペースの1つまたは2つだけを保持することができます(\ sは任意の白い区切り文字と一致します)

2

あなたはこれを試すことができます

s = "This must not b3 delet3d, but the number at the end yes 134411"
re.sub("(\s\d+)","",s) 

結果:

'This must not b3 delet3d, but the number at the end yes'

同じルールが適用されます

s = "This must not b3 delet3d, 4566 but the number at the end yes 134411" 
re.sub("(\s\d+)","",s) 

結果:

'This must not b3 delet3d, but the number at the end yes'
1
adesst

非正規表現ソリューション:

_>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> " ".join([x for x in s.split(" ") if not x.isdigit()])
'This must not b3 delet3d, but the number at the end yes'
_

_" "_で分割し、 str().isdigit() を実行してチャンクが数値であるかどうかを確認してから、それらを結合します。より詳細に(リスト内包表記を使用しない):

_words = s.split(" ")
non_digits = []
for Word in words:
    if not Word.isdigit():
        non_digits.append(Word)

" ".join(non_digits)
_
1
dbr

あなたの実際の状況がどのように見えるかはわかりませんが、ほとんどの回答は負の数や小数を処理しないように見えます。

re.sub(r"(\b|\s+\-?|^\-?)(\d+|\d*\.\d+)\b","")

上記は、次のようなことも処理する必要があります。

「これはb3delet3dであってはなりませんが、最後の数字ははい-134.411です」

しかし、これはまだ不完全です-おそらく、解析する必要のあるファイルで見つけることができるもののより完全な定義が必要です。

編集:使用しているロケール/文字セットに応じて「\ b」が変わることにも注意する必要があるため、少し注意する必要があります。

1
si28719e
>>>s = "This must not b3 delet3d, but the number at the end yes 134411"
>>>s = re.sub(r"\d*$", "", s)
>>>s

「これはb3delet3dであってはなりませんが、最後の数字はあります」

これにより、文字列の最後にある数値が削除されます。