Kiểm tra xem chuỗi có khớp với mẫu không


317

Làm cách nào để kiểm tra xem một chuỗi có khớp với mẫu này không?

Chữ in hoa, số (s), chữ in hoa, số (s) ...

Ví dụ: Những cái này sẽ khớp:

A1B2
B10L1
C1N200J1

Những điều này sẽ không ('^' chỉ ra vấn đề)

a1B2
^
A10B
   ^
AB400
^

3
bạn có thể vui lòng giải thích thêm tại sao nó là một vấn đề?
John Woo

4
^([A-Z]\d+){1,}$như thế này?
Người qua đường

Trong ví dụ thứ ba của bạn, vấn đề nên có Bvà không có A.
Burhan Khalid

có thể đó là một lỗi đánh máy về vấn đề này. cả hai ABlà chữ nhỏ phải không? A10baB400?
John Woo

@Burhan, Vấn đề là ở A vì B có số bên cạnh và A không
DanielTA

Câu trả lời:


465
import re
pattern = re.compile("^([A-Z][0-9]+)+$")
pattern.match(string)

Chỉnh sửa: Như đã lưu ý trong các nhận xét, matchchỉ kiểm tra các kết quả khớp ở đầu chuỗi trong khi re.search()sẽ khớp với một mẫu ở bất kỳ đâu trong chuỗi. (Xem thêm: https://docs.python.org/l Library / re.html # search-vs-match )


20
Từ các tài liệu trên re.match: If zero or more characters at the beginning of string match the regular expression pattern. Tôi chỉ mất 30 phút để cố gắng hiểu tại sao tôi không thể kết hợp thứ gì đó ở cuối chuỗi. Có vẻ như không thể với matchnó, phải không? Đối với điều đó, re.search(pattern, my_string)làm việc mặc dù.
conradkleinespel

2
@conradk Vâng, bạn nói đúng, tôi nghĩ có một cái gì đó giống như ngụ ý ^lúc ban đầu khi bạn sử dụng match. Tôi nghĩ rằng nó phức tạp hơn một chút sau đó là lời giải thích rất đơn giản, nhưng tôi không rõ ràng. Bạn đúng rằng nó bắt đầu từ đầu chuỗi.
CrazyCasta

173

Lót: re.match(r"pattern", string) # No need to compile

import re
>>> if re.match(r"hello[0-9]+", 'hello1'):
...     print('Yes')
... 
Yes

Bạn có thể đánh giá nó như boolthể cần thiết

>>> bool(re.match(r"hello[0-9]+", 'hello1'))
True

Mất tích import renhư là dòng đầu tiên
arod

Lạ nhỉ. Tại sao bạn có thể sử dụng re.matchtrong ngữ cảnh của một if, nhưng bạn phải sử dụng boolnếu bạn đang sử dụng nó ở nơi khác?
LondonRob

16
Cẩn thận với re.match. Nó chỉ phù hợp khi bắt đầu một chuỗi. Có một cái nhìn re.searchthay thế.
LondonRob

@LondonRob có lẽ vì ifkiểm tra trận đấu không được None.
Dennis

Có một nhu cầu lớn để biên dịch để đảm bảo không có lỗi trong các biểu thức thông thường như lỗi phạm vi ký tự xấu
Suh Fangmbeng

36

Hãy thử như sau:

import re

name = ["A1B1", "djdd", "B2C4", "C2H2", "jdoi","1A4V"]

# Match names.
for element in name:
     m = re.match("(^[A-Z]\d[A-Z]\d)", element)
     if m:
        print(m.groups())

1
Đây là trường hợp duy nhất trả về kết quả khớp được yêu cầu để nhận các nhóm. Câu trả lời tốt nhất theo ý kiến ​​của tôi.
Rick Smith

24
import re
import sys

prog = re.compile('([A-Z]\d+)+')

while True:
  line = sys.stdin.readline()
  if not line: break

  if prog.match(line):
    print 'matched'
  else:
    print 'not matched'

7

biểu thức chính quy làm cho điều này dễ dàng ...

[A-Z] sẽ khớp chính xác một ký tự giữa A và Z

\d+ sẽ khớp với một hoặc nhiều chữ số

() nhóm các thứ (và cũng trả lại mọi thứ ... nhưng bây giờ chỉ cần nghĩ về chúng nhóm)

+ chọn 1 hoặc nhiều hơn


6
  
import re

ab = re.compile("^([A-Z]{1}[0-9]{1})+$")
ab.match(string)
  


Tôi tin rằng nên làm việc cho một chữ hoa, mẫu số .

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.