Periksa apakah string cocok dengan pola

317

Bagaimana cara memeriksa apakah string cocok dengan pola ini?

Huruf besar, angka, huruf besar, angka ...

Contoh, Ini akan cocok:

A1B2
B10L1
C1N200J1

Ini tidak akan ('^' menunjukkan masalah)

a1B2
^
A10B
   ^
AB400
^
DanielTA
sumber
3
dapatkah Anda menjelaskan lebih lanjut mengapa ini menjadi masalah?
John Woo
4
^([A-Z]\d+){1,}$seperti ini?
Pejalan kaki
Dalam contoh ketiga Anda, masalahnya harus dengan Bdan bukan dengan A.
Burhan Khalid
mungkin itu kesalahan ketik pada masalah tersebut. keduanya Adan Bapakah huruf kecil benar? A10bdan aB400?
John Woo
@ Burhan, Masalahnya adalah dengan A karena B memiliki angka di sebelahnya dan A tidak
DanielTA

Jawaban:

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

Sunting: Seperti yang tercantum dalam komentar, matchhanya memeriksa kecocokan di awal string sementara re.search()akan mencocokkan pola di mana saja dalam string. (Lihat juga: https://docs.python.org/library/re.html#search-vs-match )

CrazyCasta
sumber
20
Dari docs di re.match: If zero or more characters at the beginning of string match the regular expression pattern. Saya hanya menghabiskan waktu 30 menit untuk mencoba memahami mengapa saya tidak dapat mencocokkan sesuatu di akhir string. Sepertinya itu tidak mungkin match, kan? Untuk itu, re.search(pattern, my_string)usahakan.
conradkleinespel
2
@conradk Ya, Anda benar, saya pikir ada sesuatu seperti tersirat ^di awal ketika Anda gunakan match. Saya pikir ini sedikit lebih rumit daripada penjelasan yang sangat sederhana, tapi saya tidak jelas. Anda benar bahwa itu memang dimulai dari awal string.
CrazyCasta
173

Satu-liner: re.match(r"pattern", string) # No need to compile

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

Anda dapat mengevaluasi itu seolah- boololah diperlukan

>>> bool(re.match(r"hello[0-9]+", 'hello1'))
True
nehem
sumber
Hilang import resebagai baris pertama
arod
Itu aneh. Mengapa Anda dapat menggunakan re.matchdalam konteks suatu if, tetapi Anda harus menggunakannya booljika Anda menggunakannya di tempat lain?
LondonRob
16
Hati-hati dengan re.match. Ini hanya cocok pada awal string. Lihatlah re.searchsebagai gantinya.
LondonRob
@LondonRob mungkin karena ifmemeriksa pertandingan tidak ada None.
Dennis
Ada kebutuhan besar untuk dikompilasi untuk memastikan tidak ada kesalahan dalam ekspresi reguler seperti kesalahan rentang karakter yang buruk
Suh Fangmbeng
36

Silakan coba yang berikut ini:

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())
sumeet agrawal
sumber
1
Ini adalah satu-satunya kasus yang mengembalikan pertandingan yang diperlukan untuk mendapatkan grup. Jawaban terbaik menurut saya.
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'
Marc Cohen
sumber
7

ekspresi reguler membuat ini mudah ...

[A-Z] akan sama persis dengan satu karakter antara A dan Z

\d+ akan cocok dengan satu atau lebih digit

() hal-hal kelompok (dan juga mengembalikan barang-barang ... tetapi untuk sekarang pikirkan saja pengelompokan itu)

+ memilih 1 atau lebih

Joran Beasley
sumber
6
  
import re

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


Saya percaya itu harus bekerja untuk huruf besar, pola angka .

Berlutut-Sebelum-ZOD
sumber