นิพจน์ทั่วไปของ Python ส่งคืนจริง / เท็จ


115

การใช้นิพจน์ทั่วไปของ Python คุณจะได้รับTrue/ Falseส่งคืนได้อย่างไร ผลตอบแทนของ Python ทั้งหมดคือ:

<_sre.SRE_Match object at ...>

คำตอบ:


140

Matchออบเจ็กต์เป็นจริงเสมอและNoneจะส่งคืนหากไม่มีการจับคู่ เพียงทดสอบความถูกต้อง

if re.match(...):

21
re.match (... ) จะคืนค่าเป็นจริงหากส่วนเริ่มต้นของสตริงตรงกับรูปแบบปกติ ในขณะที่การค้นหาจะยืนยันรูปแบบที่ใดก็ได้ในสตริง
Yu Shen

8
อาจเป็นที่ต้องการมากกว่าที่จะใช้if re.match(...) is None:แทน
NuclearPeon

ขอโทษคุณตอบความคิดเห็นในคำตอบของคุณหรือไม่ มันไม่ชัดเจนสำหรับฉันคุณช่วยชี้แจงหรือไม่?
Charlie Parker

2
ขอถามว่าทำไม reออกแบบมาแบบนี้ ถ้าอmatchอบเจ็กต์เป็นจริงเสมอทำไมมันไม่กลับมาTrueตั้งแต่แรกเพราะเราจำเป็นต้องรู้เสมอว่าคำตอบนั้นเป็นจริงหรือเท็จ
ytu

1
@ytu: เพราะงั้นคุณสามารถทำทุกอย่างที่คุณต้องการได้
Ignacio Vazquez-Abrams

149

หากคุณต้องการจริงๆTrueหรือFalseเพียงแค่ใช้bool

>>> bool(re.search("hi", "abcdefghijkl"))
True
>>> bool(re.search("hi", "abcdefgijkl"))
False

ดังที่คำตอบอื่น ๆ ได้ชี้ให้เห็นหากคุณเพียงแค่ใช้เป็นเงื่อนไขสำหรับifหรือwhileคุณสามารถใช้มันได้โดยตรงโดยไม่ต้องห่อbool()


1
boolจำเป็นต้องมีค่าเมื่อคำสั่งเงื่อนไขมีการดำเนินการทางคณิตศาสตร์แบบบูลีน เช่น: if (re.search ("a", "abc") & True):
Aizzat Suhardi

2
@AizzatSuhardi, &เป็นค่าที่เหมาะสม operaration andจะเป็นการดำเนินการบูลีน
John La Rooy

1
ขอบคุณ @JohnLaRooy แก้ไข:(re.search("a","abc") and True)
Aizzat Suhardi

สิ่งนี้แตกต่างจากคำตอบของ ignacio อย่างไร?
Charlie Parker

2
การห่อเข้าboolทำให้ความตั้งใจของโปรแกรมเมอร์ชัดเจนสำหรับผู้อ่าน
Guilherme Salomé

10

Ignacio Vazquez-Abrams ถูกต้อง แต่ถ้าจะอธิบายให้ละเอียดre.match()จะส่งกลับอย่างใดอย่างหนึ่งNoneซึ่งประเมินเป็นFalseหรือวัตถุที่ตรงกันซึ่งจะเป็นไปTrueตามที่เขากล่าวเสมอ เฉพาะในกรณีที่คุณต้องการข้อมูลเกี่ยวกับส่วนที่ตรงกับนิพจน์ทั่วไปของคุณคุณจำเป็นต้องตรวจสอบเนื้อหาของวัตถุที่ตรงกัน


6

วิธีหนึ่งที่ทำได้คือทดสอบกับค่าที่ส่งคืน เนื่องจากคุณได้รับ<_sre.SRE_Match object at ...>มันหมายความว่าสิ่งนี้จะประเมินเป็นจริง เมื่อนิพจน์ทั่วไปไม่ตรงคุณจะได้รับค่าที่ส่งกลับไม่มีซึ่งประเมินว่าเป็นเท็จ

import re

if re.search("c", "abcdef"):
    print "hi"

ผลิตhiเป็นเอาต์พุต


คุณจะได้รับผลตอบแทนเสมอ Noneเป็นค่าเริ่มต้นหากไม่มีการส่งคืนอย่างชัดเจน
Ignacio Vazquez-Abrams

ขอบคุณ - แก้ไขแล้ว ฉันแค่ไปตามสิ่งที่ฉันเห็นใน REPL
Gavin Anderegg

4

นี่คือวิธีการของฉัน:

import re
# Compile
p = re.compile(r'hi')
# Match and print
print bool(p.match("abcdefghijkl"))

1
p = re.comp il e (r'hi ') :-P
Clay

ใช่แล้วมันจะส่งคืน "เท็จ"
Ufos

ถ้าคุณเปลี่ยนmatchไปsearchก็จะกลับจริง
alofgran

1

คุณสามารถใช้re.match()หรือre.search(). Python นำเสนอการดำเนินการดั้งเดิมที่แตกต่างกันสองแบบตามนิพจน์ทั่วไป: re.match()ตรวจสอบการจับคู่เฉพาะที่จุดเริ่มต้นของสตริงในขณะที่re.search()ตรวจสอบการจับคู่ที่ใดก็ได้ในสตริง (นี่คือสิ่งที่ Perl ทำโดยค่าเริ่มต้น) อ้างถึงสิ่งนี้

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