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
^

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 )


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

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())

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'

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


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 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.