Dizenin desenle eşleşip eşleşmediğini kontrol edin


317

Bir dizenin bu kalıpla eşleşip eşleşmediğini nasıl kontrol ederim?

Büyük harf, sayı (lar), büyük harf, sayı (ler) ...

Örnek, Bunlar aşağıdakilerle eşleşir:

A1B2
B10L1
C1N200J1

Bunlar olmaz ('^' soruna işaret eder)

a1B2
^
A10B
   ^
AB400
^

3
bunun neden bir sorun olduğunu daha fazla açıklayabilir misiniz?
John Woo

4
^([A-Z]\d+){1,}$bunun gibi?
Passerby

Üçüncü örneğinizde, sorun ile Bdeğil, ile birlikte olmalıdır A.
Burhan Khalid

belki de bu sorunla ilgili bir yazım hatasıdır. her ikisi de Ave Bküçük harfler doğru mu? A10bve aB400?
John Woo

@Burhan, Sorun A ile ilgili çünkü B'nin yanında sayılar var ve A yok
DanielTA

Yanıtlar:


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

Düzenleme: Yorumlarda belirtildiği gibi, matchyalnızca dizenin başındaki eşleşmeleri denetlerken dizenin re.search()herhangi bir yerinde bir desenle eşleşir. (Ayrıca bkz: https://docs.python.org/library/re.html#search-vs-match )


20
Dokümanlar üzerinde re.match: If zero or more characters at the beginning of string match the regular expression pattern. Bir ipin sonunda neden bir şey eşleştiremediğimi anlamaya çalışırken sadece 30 dakika geçirdim. Bu mümkün değil gibi görünüyor match, değil mi? Bunun için re.search(pattern, my_string)olsa çalışır.
conradkleinespel

2
@conradk Evet, haklısın, bence ^kullandığın başında ima edilen gibi bir şey var match. Bence bu çok basit bir açıklamadan biraz daha karmaşık, ama net değilim. Yine de dize başından başlar doğru.
CrazyCasta

173

Tek astarı: re.match(r"pattern", string) # No need to compile

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

boolGerektiği gibi değerlendirebilirsiniz

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

import reİlk satır olarak eksik
arod

Bu tuhaf. Neden bir re.matchbağlamında kullanabilirsiniz if, ancak boolbaşka bir yerde kullanıyorsanız kullanmak zorundasınız ?
LondonRob

16
Dikkatli ol re.match. Yalnızca bir dizenin başlangıcında eşleşir. re.searchBunun yerine bir göz atın .
LondonRob

@LondonRob muhtemelen ifmaçın kontrol edilmemesi nedeniyle None.
Dennis

Kötü karakter aralığı hataları gibi normal ifadelerde hiçbir hata olmadığından emin olmak için derlemeye büyük ihtiyaç vardır
Suh Fangmbeng

36

Lütfen aşağıdakileri deneyin:

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
Grupları almak için gereken eşleşmeyi döndüren tek durum budur. Bence en iyi cevap.
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

düzenli ifadeler bunu kolaylaştırır ...

[A-Z] A ve Z arasında bir karakterle eşleşir

\d+ bir veya daha fazla rakamla eşleşecek

() bir şeyleri gruplandır (ve bir şeyleri de geri ver ... ama şimdilik sadece gruplandırmayı düşün)

+ 1 veya daha fazlasını seçer


6
  
import re

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


Bunun büyük harf, sayı deseni için çalışması gerektiğine inanıyorum .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.