ตรวจสอบว่าสตริงตรงกับรูปแบบ


317

ฉันจะตรวจสอบว่าสตริงตรงกับรูปแบบนี้ได้อย่างไร

ตัวอักษรตัวพิมพ์ใหญ่, ตัวเลข (s), ตัวอักษรตัวพิมพ์ใหญ่, ตัวเลข (s) ...

ตัวอย่างสิ่งเหล่านี้จะตรงกับ:

A1B2
B10L1
C1N200J1

สิ่งเหล่านี้จะไม่ ('^' ชี้ไปที่ปัญหา)

a1B2
^
A10B
   ^
AB400
^

3
คุณช่วยอธิบายเพิ่มเติมได้ไหมว่าทำไมมันถึงมีปัญหา
John Woo

4
^([A-Z]\d+){1,}$แบบนี้?
Passerby

ในตัวอย่างที่สามของคุณปัญหาควรจะมีและไม่ได้มีB A
Burhan Khalid

อาจเป็นข้อผิดพลาดที่พิมพ์ผิดในปัญหา ทั้งสองAและBตัวอักษรเล็ก ๆ ถูกไหม? A10bและaB400?
John Woo

@Burhan ปัญหาอยู่กับ A เพราะ B มีตัวเลขอยู่ข้างๆและ A ไม่ได้
DanielTA

คำตอบ:


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

แก้ไข: ดังที่ระบุไว้ในความคิดเห็นmatchจะตรวจสอบเฉพาะการจับคู่ที่จุดเริ่มต้นของสตริงในขณะที่re.search()จะจับคู่รูปแบบที่ใดก็ได้ในสตริง (ดูเพิ่มเติมที่: https://docs.python.org/library/re.html#search-vs-match )


20
จากเอกสารบน:re.match If zero or more characters at the beginning of string match the regular expression patternฉันใช้เวลา 30 นาทีในการพยายามทำความเข้าใจว่าทำไมฉันจึงไม่สามารถจับคู่บางอย่างที่ปลายสตริง ดูเหมือนว่าเป็นไปไม่ได้ด้วยmatchใช่ไหม สำหรับที่re.search(pattern, my_string)ทำงานแม้ว่า
conradkleinespel

2
@conradk ใช่คุณขวาผมคิดว่ามีสิ่งที่ต้องการโดยนัยที่จุดเริ่มต้นเมื่อคุณใช้^ matchฉันคิดว่ามันซับซ้อนกว่าเล็กน้อยจากนั้นคำอธิบายที่ง่ายมาก แต่ฉันไม่ชัดเจน คุณถูกต้องว่ามันจะเริ่มต้นจากจุดเริ่มต้นของสตริงว่า
CrazyCasta

173

หนึ่งในสายการบิน: re.match(r"pattern", string) # No need to compile

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

คุณสามารถประเมินผลได้boolถ้าจำเป็น

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

หายไปimport reเป็นบรรทัดแรก
Arod

แปลกแฮะ, แปลกนะ, มันแปลก ๆ นะ. ทำไมคุณสามารถใช้re.matchในบริบทของifแต่คุณต้องใช้boolถ้าคุณใช้มันที่อื่น?
LondonRob

16
re.matchระมัดระวังด้วย มันตรงกับที่จุดเริ่มต้นของสตริงเท่านั้น ได้ดูre.searchแทน
LondonRob

@LondonRob อาจจะเป็นเพราะการตรวจสอบสำหรับการแข่งขันไม่เป็นifNone
Dennis

มีความต้องการอย่างมากในการรวบรวมเพื่อให้แน่ใจว่าไม่มีข้อผิดพลาดในการแสดงออกปกติเช่นข้อผิดพลาดช่วงตัวละครที่ไม่ดี
Suh Fangmbeng

36

กรุณาลองต่อไปนี้:

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
นี่เป็นกรณีเดียวที่ส่งคืนการจับคู่ที่จำเป็นสำหรับการรับกลุ่ม คำตอบที่ดีที่สุดในความคิดของฉัน
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

นิพจน์ทั่วไปทำให้เป็นเรื่องง่าย ...

[A-Z] จะจับคู่อักขระหนึ่งตัวระหว่าง A และ Z

\d+ จะจับคู่หนึ่งหลักหรือมากกว่า

() จัดกลุ่มสิ่งต่าง ๆ (และส่งคืนสิ่งต่าง ๆ ... แต่สำหรับตอนนี้ให้นึกถึงการจัดกลุ่ม)

+ เลือก 1 หรือมากกว่า


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.