Xóa số khỏi chuỗi [đã đóng]


120

Làm cách nào để xóa các chữ số khỏi một chuỗi?


19
Với re:result = re.sub(r'[0-9]+', '', s)
Wiktor Stribiżew

với regex, bạn sẽ cần thêm \. ngoài ra, vì nó có thể là số thập phân mà tôi nghĩ. như kết quả = re.sub (r '[0-9 \.] +', '', s)
GurhanCagin

1
"\d"giống nhau trong regex as "[0-9]", vì vậy bạn có thể làm result = re.sub(r"\d+", "", s)thay thế. Tốc độ có thể sẽ phụ thuộc vào chuỗi cụ thể đang được sử dụng, nhưng đối với tôi, re.submất khoảng gấp đôi str.translate(lâu hơn một chút nếu bạn không sử dụng mẫu biên dịch trước).
Nathan

Câu trả lời:


185

Điều này có phù hợp với hoàn cảnh của bạn không?

>>> s = '12abcd405'
>>> result = ''.join([i for i in s if not i.isdigit()])
>>> result
'abcd'

Điều này sử dụng khả năng hiểu danh sách và những gì đang xảy ra ở đây tương tự như cấu trúc này:

no_digits = []
# Iterate through the string, adding non-numbers to the no_digits list
for i in s:
    if not i.isdigit():
        no_digits.append(i)

# Now join all elements of the list with '', 
# which puts all of the characters together.
result = ''.join(no_digits)

Như @AshwiniChaudhary và @KirkStrauser đã chỉ ra, bạn thực sự không cần sử dụng dấu ngoặc trong một chữ lót, làm cho phần bên trong dấu ngoặc đơn trở thành biểu thức trình tạo (hiệu quả hơn so với việc hiểu danh sách). Ngay cả khi điều này không phù hợp với các yêu cầu cho bài tập của bạn, thì đó là điều cuối cùng bạn nên đọc :):

>>> s = '12abcd405'
>>> result = ''.join(i for i in s if not i.isdigit())
>>> result
'abcd'

@SeanJohnson Tuyệt vời! Tôi chắc rằng tôi biết rằng từ người khác trên trang web này, vì vậy chu trình hoàn tất :)
RocketDonkey

@RocketDonkey không cần[]
Ashwini Chaudhary

3
Trong Python 2.7 trở lên, bạn không cần dấu ngoặc quanh khả năng hiểu danh sách. Bạn có thể loại bỏ chúng và nó trở thành một biểu thức máy phát điện.
Kirk Strauser 12/10/12

Đã sửa - cảm ơn @ AshwiniChaudhary / @ KirkStrauser.
RocketDonkey

@RocketDonkey cũng thêm một số giải thích, tôi đoán chỉ nhìn thấy mã sẽ không giúp được gì cho OP.
Ashwini Chaudhary

97

Và, chỉ để ném nó vào hỗn hợp, là oft-quên str.translatesẽ hoạt động nhanh hơn rất nhiều so với lặp / biểu thức chính quy:

Đối với Python 2:

from string import digits

s = 'abc123def456ghi789zero0'
res = s.translate(None, digits)
# 'abcdefghizero'

Đối với Python 3:

from string import digits

s = 'abc123def456ghi789zero0'
remove_digits = str.maketrans('', '', digits)
res = s.translate(remove_digits)
# 'abcdefghizero'

13
Cách tiếp cận này sẽ không hoạt động trong Python3. Làm thay: 'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
valignatev

3
Giải pháp tốt nhất cho Python2.
Harsh Wardhan

Không hoạt động đối với chuỗi ký tự unicode
Harry M

20

Không chắc liệu giáo viên của bạn có cho phép bạn sử dụng bộ lọc hay không nhưng ...

filter(lambda x: x.isalpha(), "a1a2a3s3d4f5fg6h")

trả lại-

'aaasdffgh'

Hiệu quả hơn nhiều so với lặp ...

Thí dụ:

for i in range(10):
  a.replace(str(i),'')

1
nó trả về cái này thay vào đó: <filter object at 0x03475FD0>
alone_coder 27/03

5

Cái này thì sao:

out_string = filter(lambda c: not c.isdigit(), in_string)

4
Đầu ra là <filter object at 0x7f749e1745c0>. Python3.6
TitanFighter

@TitanFighter Bạn có thể ép buộc các máy phát điện vào một đối tượng danh sách bằng cách gói đó quay trở lại đối tượng từ bộ lọc vào danh sách (bộ lọc (...))
ahlusar1989

5

Chỉ một vài (những người khác đã đề xuất một số trong số này)

Phương pháp 1:

''.join(i for i in myStr if not i.isdigit())

Phương pháp 2:

def removeDigits(s):
    answer = []
    for char in s:
        if not char.isdigit():
            answer.append(char)
    return ''.join(char)

Phương pháp 3:

''.join(filter(lambda x: not x.isdigit(), mystr))

Phương pháp 4:

nums = set(map(int, range(10)))
''.join(i for i in mystr if i not in nums)

Phương pháp 5:

''.join(i for i in mystr if ord(i) not in range(48, 58))

2
Sẽ rất đáng giá nếu so sánh hiệu quả trên những thứ này.
nu everest

2

Giả sử st là chuỗi chưa được định dạng của bạn, sau đó chạy

st_nodigits=''.join(i for i in st if i.isalpha())

như đã đề cập ở trên. Nhưng tôi đoán rằng bạn cần một cái gì đó rất đơn giản, vì vậy hãy nói s là chuỗi của bạn và st_res là chuỗi không có chữ số, sau đó đây là mã của bạn

l = ['0','1','2','3','4','5','6','7','8','9']
st_res=""
for ch in s:
 if ch not in l:
  st_res+=ch

1

Tôi muốn sử dụng regex để thực hiện điều này, nhưng vì bạn chỉ có thể sử dụng danh sách, vòng lặp, hàm, v.v.

đây là những gì tôi nghĩ ra:

stringWithNumbers="I have 10 bananas for my 5 monkeys!"
stringWithoutNumbers=''.join(c if c not in map(str,range(0,10)) else "" for c in stringWithNumbers)
print(stringWithoutNumbers) #I have  bananas for my  monkeys!

1

Nếu tôi hiểu câu hỏi của bạn đúng, một cách để làm là chia nhỏ chuỗi thành các ký tự và sau đó kiểm tra từng ký tự trong chuỗi đó bằng cách sử dụng một vòng lặp cho dù đó là một chuỗi hay một số và sau đó nếu chuỗi lưu nó trong một biến và sau đó lặp lại một lần đã hoàn tất, hiển thị điều đó cho người dùng


Vòng lặp for tự động lặp qua mọi ký tự của chuỗi, vì vậy không cần ngắt chuỗi thành các ký tự.
Ashwini Chaudhary
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.