文字と数字のみを使用できるように、文字列からすべての特殊文字、句読点、スペースを削除する必要があります。
文字と数字のみを使用できるように、文字列からすべての特殊文字、句読点、スペースを削除する必要があります。
回答:
これは正規表現なしで行うことができます:
>>> string = "Special $#! characters spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'
使用できますstr.isalnum
:
S.isalnum() -> bool Return True if all characters in S are alphanumeric and there is at least one character in S, False otherwise.
正規表現の使用を主張する場合は、他のソリューションで問題ありません。ただし、正規表現を使用せずに実行できる場合は、それが最善の方法です。
isalnum()
とregexの両方のバージョンをベンチマークしました、そしてregexは50-75%速いです
以下は、文字でも数字でもない文字列に一致する正規表現です。
[^A-Za-z0-9]+
正規表現の置換を行うPythonコマンドを次に示します。
re.sub('[^A-Za-z0-9]+', '', mystring)
+
その効率を少し改善するために
[^A-Za-z0-9 ]+
より短い方法:
import re
cleanString = re.sub('\W+','', string )
単語と数字の間にスペースが必要な場合は、 ''を ''に置き換えます
これを見た後、最も短い時間で実行されるものを見つけることにより、提供された回答を拡張することに興味があったので、提案された回答のいくつかを調べて、timeit
2つの例の文字列と照合しました。
string1 = 'Special $#! characters spaces 888323'
string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'
'.join(e for e in string if e.isalnum())
string1
-結果:10.7061979771string2
-結果:7.78372597694import re
re.sub('[^A-Za-z0-9]+', '', string)
string1
-結果:7.10785102844string2
-結果:4.12814903259import re
re.sub('\W+','', string)
string1
-結果:3.11899876595string2
-結果:2.78014397621上記の結果は、次の平均から返される最低の結果の積です。 repeat(3, 2000000)
例3は、例1の 3倍の速度になります。
''.join([*filter(str.isalnum, string)])
私はfilter(str.isalnum, string)
うまくいくと思います
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
Python3では、filter( )
関数は(上記のように文字列ではなく)反復可能なオブジェクトを返します。itertableから文字列を取得するには、後ろに結合する必要があります。
''.join(filter(str.isalnum, string))
またはlist
、結合の使用を渡す(不明ですが、少し高速になる可能性があります)
''.join([*filter(str.isalnum, string)])
注:Python 3.5[*args]
以降からの有効な解凍
map
ではfilter
、reduce
代わりに反復可能なオブジェクトを返します。それでもPython3 + では、受け入れられた回答よりも''.join(filter(str.isalnum, string))
(またはjoin useでリストを渡すこと''.join([*filter(str.isalnum, string)])
)を好み ます。
''.join(filter(str.isalnum, string))
、が改善されているかどうかはわかりませんfilter(str.isalnum, string)
。これは本当にPythreenic(そう、あなたはそれを使うことができます)の方法ですか?
filter(str.isalnum, string)
ですfilter( )
。+
他の誰もが正規表現を使用していたのとは異なり、私はそうではないすべての文字を除外しようとします代わりに、私はしたくないものを明示的に列挙すると、私が欲しいものを。
たとえば、「aからz」までの文字(大文字と小文字)と数字のみが必要な場合、他のすべてを除外します。
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
これは、「数字ではないすべての文字、または 'a〜z'または 'A〜Z'の範囲の文字を空の文字列に置き換える」ことを意味します。
実際、^
正規表現の最初の場所に特殊文字を挿入すると、否定が発生します。
追加のヒント:結果も小文字にする必要がある場合は、大文字が見つからない限り、正規表現をさらに速く簡単にすることができます。
import re
s = re.sub(r"[^a-z0-9]","",s.lower())
最も一般的なアプローチは、すべての単一の文字を分類するunicodedataテーブルの「カテゴリ」を使用することです。たとえば、次のコードは、カテゴリに基づいて印刷可能な文字のみをフィルタリングします。
import unicodedata
# strip of crap characters (based on the Unicode database
# categorization:
# http://www.sql-und-xml.de/unicode-database/#kategorien
PRINTABLE = set(('Lu', 'Ll', 'Nd', 'Zs'))
def filter_non_printable(s):
result = []
ws_last = False
for c in s:
c = unicodedata.category(c) in PRINTABLE and c or u'#'
result.append(c)
return u''.join(result).replace(u'#', u' ')
関連するすべてのカテゴリについては、上記のURLをご覧ください。もちろん、句読点のカテゴリでフィルタリングすることもできます。
$
各行の末尾に?
翻訳を使用:
import string
def clean(instr):
return instr.translate(None, string.punctuation + ' ')
警告:ASCII文字列でのみ機能します。
TypeError: translate() takes exactly one argument (2 given)
はpy3.4で取得します
import re
my_string = """Strings are amongst the most popular data types in Python. We can create the strings by enclosing characters in quotes. Python treats single quotes the
二重引用符と同じです。 "" "
# if we need to count the word python that ends with or without ',' or '.' at end
count = 0
for i in text:
if i.endswith("."):
text[count] = re.sub("^([a-z]+)(.)?$", r"\1", i)
count += 1
print("The count of Python : ", text.count("python"))
句読点、数字、特殊文字を削除する
例:-
コード
combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ")
ありがとう:)
ドイツ語、スペイン語、デンマーク語、フランス語など、特殊文字を含む他の言語(ドイツ語の "Umlaute" ü
などä
)ö
単に正規表現検索文字列にこれらを追加します):
ドイツ語の例:
re.sub('[^A-ZÜÖÄa-z0-9]+', '', mystring)