2009-05-03 63 views
13

Tôi đang cố xóa tất cả các chữ số khỏi chuỗi. Tuy nhiên mã tiếp theo sẽ xóa các chữ số có trong bất kỳ từ nào và rõ ràng là tôi không muốn. Tôi đã thử nhiều cụm từ thông dụng và không thành công.Xóa chữ số bằng Python (Regex)

Cảm ơn!


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

Kết quả:

Đây không phải b deletd, nhưng số cuối cùng có

Trả lời

18

Thêm một không gian trước khi \ 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 ' 

Chỉnh sửa: Sau khi xem nhận xét, tôi quyết định tạo câu trả lời hoàn chỉnh hơn. Tôi nghĩ rằng tài khoản này cho tất cả các trường hợp.

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

Ồ, cảm ơn, nó đã hoạt động! – Menda

+1

Còn các chuỗi như "3at" thì sao? – marcog

+0

Đây là 2 trường hợp khác cho bài kiểm tra đơn vị của bạn: '123 nên bị xóa'. và 'Bạn đã là 0wn3d' –

2

Nếu số của bạn là allways ở phần cuối của chuỗi bạn thử: re.sub ("\ d + $", "", s)

nếu không, bạn có thể thử re.sub ("(\ s) \ d + (\ s)", "\ 1 \ 2", s)

Bạn có thể điều chỉnh tham chiếu ngược để chỉ giữ một hoặc hai khoảng trắng (\ s khớp với bất kỳ dấu tách màu trắng nào)

+0

\ W có lẽ tốt hơn \ s cho việc này. Ngoài ra, một biến thể tốt hơn sẽ là "\ b \ d + \ b" ngoại trừ việc nó không hoạt động đối với tôi! – dwc

12

Hãy thử cách này:

"\b\d+\b" 

Điều đó sẽ chỉ khớp các chữ số không thuộc một từ khác.

+0

Điều này không xóa số đầu tiên hoặc cuối cùng cho, s = s = "1234 Điều này không được b3 delet3d, 123 nhưng số cuối cùng có 134411" – oneporter

+0

Tôi vừa thử nghiệm với chuỗi của bạn và tôi nhận được kết quả mong đợi. \ b khớp với đầu chuỗi, kết thúc hoặc bất kỳ thứ gì không phải là ký tự từ ([A-Za-z0-9_]). Tôi đã thử nghiệm nó trong IronPython mặc dù, không biết nếu có một cái gì đó sai trái với xử lý của Python của ranh giới từ – jrcalzada

+0

Tôi đã không cố gắng này, nhưng bạn có thể làm một cái gì đó như: [^ \ b] \ d + [$ \ b] –

2

Xử lý chuỗi chữ số ở phần đầu của một dòng cũng như:

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

Sử dụng \s không phải là rất tốt, vì nó không xử lý các tab, et al. Một vết cắt đầu tiên tại một giải pháp tốt hơn là:

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

Lưu ý rằng mô hình là một chuỗi nguyên vì \b thường là thoát xóa lùi cho các chuỗi, và chúng tôi muốn ranh giới từ đặc biệt regex thoát để thay thế. Một phiên bản hơi fancier là:

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

Điều đó cố gắng loại bỏ khoảng trắng đầu/cuối khi có chữ số ở đầu/cuối của chuỗi. Tôi nói "cố gắng" bởi vì nếu có nhiều số ở cuối thì bạn vẫn còn một số khoảng trống.

1

giải pháp Non-regex:

>>> 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' 

Tách bởi " ", và kiểm tra xem các đoạn là một con số bằng cách làm str().isdigit(), sau đó gia nhập chúng lại với nhau.một cách chi tiết hơn (không sử dụng một danh sách hiểu biết):

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

" ".join(non_digits) 
1

Tôi không biết gì tình hình thực tế của bạn trông như thế nào, nhưng hầu hết các câu trả lời giống như họ sẽ không xử lý số âm hoặc số thập phân,

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

trên đây cũng nên xử lý những thứ như,

"phải không b3 delet3d này, nhưng số lượng vào cuối vâng -134,411"

Nhưng điều này vẫn chưa hoàn chỉnh - bạn có thể cần một định nghĩa hoàn chỉnh hơn về những gì bạn có thể mong đợi tìm thấy trong các tệp bạn cần phân tích cú pháp.

Chỉnh sửa: bạn cũng cần lưu ý rằng các thay đổi '\ b' tùy thuộc vào miền địa phương/bộ ký tự bạn đang sử dụng, do đó bạn cần phải cẩn thận với điều đó.

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

"Đây delet3d phải không b3, nhưng số ở cuối yes"

này sẽ loại bỏ các numericals ở phần cuối của chuỗi.

Các vấn đề liên quan