Tôi cần xóa tất cả các ký tự đặc biệt, dấu chấm câu và dấu cách khỏi một chuỗi để tôi chỉ có các chữ cái và số.
Tôi cần xóa tất cả các ký tự đặc biệt, dấu chấm câu và dấu cách khỏi một chuỗi để tôi chỉ có các chữ cái và số.
Câu trả lời:
Điều này có thể được thực hiện mà không cần regex:
>>> string = "Special $#! characters spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'
Bạn có thể sử dụng 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.
Nếu bạn khăng khăng sử dụng regex, các giải pháp khác sẽ làm tốt. Tuy nhiên lưu ý rằng nếu có thể được thực hiện mà không sử dụng biểu thức chính quy, đó là cách tốt nhất để thực hiện.
isalnum()
phiên bản regex và regex và phiên bản regex nhanh hơn 50-75%
Dưới đây là biểu thức chính quy để khớp với một chuỗi ký tự không phải là chữ cái hoặc số:
[^A-Za-z0-9]+
Đây là lệnh Python để thực hiện thay thế regex:
re.sub('[^A-Za-z0-9]+', '', mystring)
+
định lượng để cải thiện hiệu quả của nó một chút.)
[^A-Za-z0-9 ]+
Đường ngắn hơn:
import re
cleanString = re.sub('\W+','', string )
Nếu bạn muốn khoảng trắng giữa các từ và số thay thế '' bằng ''
Sau khi thấy điều này, tôi đã quan tâm đến việc mở rộng các câu trả lời được cung cấp bằng cách tìm ra câu trả lời nào thực hiện trong ít thời gian nhất, vì vậy tôi đã xem qua và kiểm tra một số câu trả lời được đề xuất với timeit
hai chuỗi ví dụ:
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
- Kết quả: 10.7061979771string2
- Kết quả: 7.78372597694import re
re.sub('[^A-Za-z0-9]+', '', string)
string1
- Kết quả: 7.10785102844string2
- Kết quả: 4.12814903259import re
re.sub('\W+','', string)
string1
- Kết quả: 3.11899876595string2
- Kết quả: 2,78014397621Các kết quả trên là một sản phẩm có kết quả trả về thấp nhất từ trung bình: repeat(3, 2000000)
Ví dụ 3 có thể nhanh hơn 3x so với ví dụ 1 .
''.join([*filter(str.isalnum, string)])
Tôi nghĩ chỉ cần filter(str.isalnum, string)
làm việc
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
Trong Python3, filter( )
hàm sẽ trả về một đối tượng itertable (thay vì chuỗi không giống như ở trên). Người ta phải tham gia trở lại để có được một chuỗi từ itertable:
''.join(filter(str.isalnum, string))
hoặc để list
sử dụng tham gia ( không chắc chắn nhưng có thể nhanh một chút )
''.join([*filter(str.isalnum, string)])
lưu ý: giải nén [*args]
hợp lệ từ Python> = 3.5
map
, filter
và reduce
lợi nhuận đối tượng itertable để thay thế. Vẫn trong Python3 + tôi sẽ thích ''.join(filter(str.isalnum, string))
(hoặc vượt qua danh sách sử dụng tham gia ''.join([*filter(str.isalnum, string)])
) hơn câu trả lời được chấp nhận.
''.join(filter(str.isalnum, string))
là một sự cải thiện filter(str.isalnum, string)
, ít nhất là để đọc. Đây thực sự là cách Pythreenic (yeah, bạn có thể sử dụng cách đó) để làm điều này?
filter(str.isalnum, string)
không gửi lại chuỗi trong Python3 như filter( )
trong Python3 trả về iterator chứ không phải là kiểu lập luận không giống như Python-2 +.
#!/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
bạn có thể thêm ký tự đặc biệt hơn và nó sẽ được thay thế bằng '' nghĩa là không có gì tức là chúng sẽ bị xóa.
Khác với những người khác đã sử dụng regex, tôi sẽ cố gắng loại trừ mọi nhân vật không phải là điều tôi muốn, thay vì liệt kê rõ ràng những gì tôi không muốn.
Ví dụ: nếu tôi chỉ muốn các ký tự từ 'a đến z' (chữ hoa và chữ thường) và số, tôi sẽ loại trừ mọi thứ khác:
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
Điều này có nghĩa là "thay thế mọi ký tự không phải là số hoặc ký tự trong phạm vi 'a đến z' hoặc 'A thành Z' bằng một chuỗi trống".
Trong thực tế, nếu bạn chèn ký tự đặc biệt ^
ở vị trí đầu tiên của regex của bạn, bạn sẽ nhận được phủ định.
Mẹo thêm: nếu bạn cũng cần viết thường kết quả, bạn có thể thực hiện regex nhanh hơn và dễ dàng hơn, miễn là bạn sẽ không tìm thấy bất kỳ chữ hoa nào ngay bây giờ.
import re
s = re.sub(r"[^a-z0-9]","",s.lower())
Giả sử bạn muốn sử dụng regex và bạn muốn / cần mã 2.x nhận thức Unicode có sẵn 2to3:
>>> 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'
>>>
Cách tiếp cận chung nhất là sử dụng 'loại' của bảng unicodingata để phân loại từng ký tự. Ví dụ: các bộ lọc mã sau chỉ lọc các ký tự có thể in dựa trên danh mục của chúng:
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' ')
Nhìn vào URL đã cho ở trên cho tất cả các danh mục liên quan. Tất nhiên bạn cũng có thể lọc theo các loại dấu chấm câu.
$
ở phần cuối của mỗi dòng?
chuỗi. Dấu chấm câu chứa các ký tự sau:
'! "# $% & \' () * +, -. /:; <=>? @ [\] ^ _` {|} ~ '
Bạn có thể sử dụng các chức năng dịch và maketrans để ánh xạ dấu chấm câu thành các giá trị trống (thay thế)
import string
'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))
Đầu ra:
'This is A test'
Dùng dịch thuật:
import string
def clean(instr):
return instr.translate(None, string.punctuation + ' ')
Hãy cẩn thận: Chỉ hoạt động trên chuỗi ascii.
TypeError: translate() takes exactly one argument (2 given)
với 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
giống như dấu ngoặc kép. "" "
# 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"))
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)
và bạn sẽ thấy kết quả của bạn là
'hỏihnlaskdjalsdk
re
nhưng không bao giờ sử dụng nó replace
Tiêu chí của bạn chỉ hoạt động cho chuỗi cụ thể này. Nếu chuỗi của bạn là abc = "askhnl#$%!askdjalsdk"
gì? Tôi không nghĩ sẽ làm việc trên bất cứ thứ gì khác ngoài #$%
mẫu. Có thể muốn điều chỉnh nó
Xóa dấu câu, số và ký tự đặc biệt
Thí dụ :-
Mã
combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ")
Cảm ơn :)