2012-11-22 40 views
18

tôi khá mới để trăn và regex (newbie regex ở đây), và tôi có chuỗi đơn giản sau đây:python regex: có được chữ số cuối từ một chuỗi

s=r"""99-my-name-is-John-Smith-6376827-%^-1-2-767980716""" 

Tôi muốn trích xuất chỉ có chữ số cuối cùng trong chuỗi trên có nghĩa là 767980716 và tôi đã tự hỏi làm thế nào tôi có thể đạt được điều này bằng cách sử dụng python regex.

tôi muốn làm một cái gì đó tương tự dọc theo dòng:

re.compile(r"""-(.*?)""").search(str(s)).group(1) 

chỉ ra rằng tôi muốn tìm những thứ ở giữa (*.?) Mà bắt đầu với một "-" và kết thúc vào cuối năm string - nhưng điều này trả về không có gì ..

Tôi đã tự hỏi nếu có ai có thể chỉ cho tôi đúng hướng .. Cảm ơn.

Trả lời

26

Bạn có thể sử dụng re.match để tìm những chữ số:

>>> import re 
>>> s=r"""99-my-name-is-John-Smith-6376827-%^-1-2-767980716""" 
>>> re.match('.*?([0-9]+)$', s).group(1) 
'767980716' 

Ngoài ra, re.finditer tác phẩm chỉ là tốt:

>>> next(re.finditer(r'\d+$', s)).group(0) 
'767980716' 

Giải thích về tất cả các thành phần regexp:

  • .*?a non-greedy match và chỉ tiêu thụ càng nhiều càng tốt ible (một trận đấu tham lam sẽ tiêu thụ mọi thứ ngoại trừ chữ số cuối cùng).
  • [0-9]\d là hai cách khác nhau để ghi lại chữ số. Lưu ý rằng số sau cũng là matches digits in other writing schemes, như ୪ hoặc ൨.
  • Dấu ngoặc đơn (()) làm cho nội dung của biểu thức một nhóm, có thể được truy xuất bằng group(1) (hoặc 2 cho nhóm thứ hai, 0 cho toàn bộ kết quả phù hợp).
  • + có nghĩa là nhiều mục nhập (ít nhất một số ở cuối).
  • $ chỉ khớp với phần cuối của đầu vào.
3

Sử dụng regex dưới

\d+$ 

$ mô tả vào cuối chuỗi ..

\d là một chữ số

+ phù hợp với nhân vật trước từ 1 tới nhiều lần

4

Regex của bạn phải là (\d+)$.

  • \d+ được sử dụng để phù hợp với chữ số (một hoặc nhiều)
  • $ được sử dụng để phù hợp ở phần cuối của chuỗi.

Vì vậy, mã của bạn nên là: -

>>> s = "99-my-name-is-John-Smith-6376827-%^-1-2-767980716" 
>>> import re 
>>> re.compile(r'(\d+)$').search(s).group(1) 
'767980716' 

Và bạn không cần phải sử dụng str chức năng ở đây, như s đã là một chuỗi.

+2

Nếu bạn viết mẫu regex là 'r '(\ d +) $'', thì bạn không phải thoát dấu gạch chéo ngược. –

+0

@SamMussmann .. Vâng bạn nói đúng. Đã chỉnh sửa :) –

2

Hãy thử sử dụng \d+$ để thay thế. Điều đó khớp với một hoặc nhiều ký tự số được theo sau bởi phần cuối của chuỗi.

7

Nice và đơn giản với findall:

import re 

s=r"""99-my-name-is-John-Smith-6376827-%^-1-2-767980716""" 

print re.findall('^.*-([0-9]+)$',s) 

>>> ['767980716'] 

Regex Giải thích:

^   # Match the start of the string 
.*  # Followed by anthing 
-   # Upto the last hyphen 
([0-9]+) # Capture the digits after the hyphen 
$   # Upto the end of the string 

Hoặc đơn giản hơn chỉ phù hợp với các chữ số tiếp theo là ở phần cuối của chuỗi'([0-9]+)$'

1

Lưu các biểu thức chính quy cho một thứ đòi hỏi nhiều hơn nâng nặng.

>>> def parse_last_digits(line): return line.split('-')[-1] 
>>> s = parse_last_digits(r"99-my-name-is-John-Smith-6376827-%^-1-2-767980716") 
>>> s 
'767980716' 
Các vấn đề liên quan