文字と数字だけを持つように、文字列からすべての特殊文字、句読点、スペースを削除する必要があります。
これはregex
なしでも可能です。
>>> 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.
あなたがregex
を使うことを主張するなら、他の解決策はうまくいくでしょう。ただし、正規表現を使用せずに実行できる場合は、それを実行するのが最善の方法です。
これは、文字でも数字でもない文字列に一致する正規表現です。
[^A-Za-z0-9]+
これが正規表現置換をするPythonコマンドです。
re.sub('[^A-Za-z0-9]+', '', mystring)
もっと短い方法:
import re
cleanString = re.sub('\W+','', string )
単語と数字の間にスペースが必要な場合は、 ''を ''に置き換えてください。
これを見た後、私は提供された答えを最も短い時間で実行するのを見つけることによって拡張することに興味があったので、私は調べて2つに対して timeit
で答えを調べました。サンプル文字列
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倍高速になります。
filter(str.isalnum, string)
だけがうまくいくと思います
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
Python 3では、filter( )
関数は(上記のように文字列ではなく)可変換オブジェクトを返します。 itertableから文字列を取得するには、参加し直す必要があります。
''.join(filter(str.isalnum, string))
または結合使用でlist
を渡す( 確信はありませんが少し速い場合があります
''.join([*filter(str.isalnum, string)])
注:[*args]
での解凍は Python> = 3.5から有効です
#!/usr/bin/python
import re
strs = "how much for the maple syrup? $20.99? That's ricidulous!!!"
print strs
nstr = re.sub(r'[?|$|.|!]',r'',strs)
print nstr
nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)
print nestr
あなたはより多くの特殊文字を追加することができます、そしてそれは ''に置き換えられるでしょう何も意味しませんすなわちそれらは削除されます。
他の誰かがregexを使っていたのとは違って、私は欲しくないものを明示的に列挙するのではなく、が欲しいものではないであるすべての文字を除外しようとします。
たとえば、 'aからz'までの文字(大文字と小文字)および数字だけが必要な場合は、それ以外のすべてを除外します。
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
これは、「数字ではないすべての文字、または 'aからz'または 'AからZ'の範囲の文字を空の文字列で置き換える」ことを意味します。
実際、正規表現の最初の場所に特殊文字^
を挿入すると、否定になります。
追加のヒント:lowercaseという結果も必要な場合は、大文字が見つからない限り、正規表現をさらに速く簡単にすることができます。
import re
s = re.sub(r"[^a-z0-9]","",s.lower())
正規表現を使いたいが、2to3対応のUnicode認識2.xコードが欲しい/必要であると仮定します。
>>> import re
>>> rx = re.compile(u'[\W_]+', re.UNICODE)
>>> data = u''.join(unichr(i) for i in range(256))
>>> rx.sub(u'', data)
u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\xaa\xb2 [snip] \xfe\xff'
>>>
s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)
最も一般的な方法は、すべての単一文字を分類するユニコードデータテーブルの「カテゴリ」を使用することです。例えば。次のコードは、そのカテゴリに基づいて印刷可能文字のみをフィルタ処理します。
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文字列に対してのみ機能します。
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)
そしてあなたはあなたの結果を次のように見るでしょう。
'askhnlaskdjalsdk
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"))