web-dev-qa-db-ja.com

文字列からすべての特殊文字、句読点、スペースを削除

文字と数字だけを持つように、文字列からすべての特殊文字、句読点、スペースを削除する必要があります。

173
user664546

これは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を使うことを主張するなら、他の解決策はうまくいくでしょう。ただし、正規表現を使用せずに実行できる場合は、それを実行するのが最善の方法です。

279
user225312

これは、文字でも数字でもない文字列に一致する正規表現です。

[^A-Za-z0-9]+

これが正規表現置換をするPythonコマンドです。

re.sub('[^A-Za-z0-9]+', '', mystring)
174
Andy White

もっと短い方法:

import re
cleanString = re.sub('\W+','', string )

単語と数字の間にスペースが必要な場合は、 ''を ''に置き換えてください。

38
bastaPasta

これを見た後、私は提供された答えを最も短い時間で実行するのを見つけることによって拡張することに興味があったので、私は調べて2つに対して timeit で答えを調べました。サンプル文字列

  • string1 = 'Special $#! characters spaces 888323'
  • string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'

例1

'.join(e for e in string if e.isalnum())

  • string1 - 結果:10.7061979771
  • string2 - 結果:7.78372597694

例2

import re re.sub('[^A-Za-z0-9]+', '', string)

  • string1 - 結果:7.10785102844
  • string2 - 結果:4.12814903259

実施例3

import re re.sub('\W+','', string)

  • string1 - 結果:3.11899876595
  • string2 - 結果:2.78014397621

上記の結果は、以下の平均から返される最小の結果の積です:repeat(3, 2000000)

例3 例1 よりも3倍高速になります。

20
mbeacom

Python 2 *

filter(str.isalnum, string)だけがうまくいくと思います

In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'

Python 3 *

Python 3では、filter( )関数は(上記のように文字列ではなく)可変換オブジェクトを返します。 itertableから文字列を取得するには、参加し直す必要があります。

''.join(filter(str.isalnum, string)) 

または結合使用でlistを渡す( 確信はありませんが少し速い場合があります

''.join([*filter(str.isalnum, string)])

注:[*args]での解凍は Python> = 3.5から有効です

19
Grijesh Chauhan
#!/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

あなたはより多くの特殊文字を追加することができます、そしてそれは ''に置き換えられるでしょう何も意味しませんすなわちそれらは削除されます。

15
pkm

他の誰かが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())
9
Andrea

正規表現を使いたいが、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'
>>>
7
John Machin
s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)
5
sneha

最も一般的な方法は、すべての単一文字を分類するユニコードデータテーブルの「カテゴリ」を使用することです。例えば。次のコードは、そのカテゴリに基づいて印刷可能文字のみをフィルタ処理します。

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をご覧ください。句読文字カテゴリでももちろんフィルタできます。

5
Andreas Jung

翻訳を使用する:

import string

def clean(instr):
    return instr.translate(None, string.punctuation + ' ')

警告:ASCII文字列に対してのみ機能します。

3
jjmurre
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)

そしてあなたはあなたの結果を次のように見るでしょう。

'askhnlaskdjalsdk

1
Dsw Wds
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"))
0