ฉันต้องการใช้สิ่งvariable
ภายในregex
ฉันจะทำสิ่งนี้ได้Python
อย่างไร
TEXTO = sys.argv[1]
if re.search(r"\b(?=\w)TEXTO\b(?!\w)", subject, re.IGNORECASE):
# Successful match
else:
# Match attempt failed
ฉันต้องการใช้สิ่งvariable
ภายในregex
ฉันจะทำสิ่งนี้ได้Python
อย่างไร
TEXTO = sys.argv[1]
if re.search(r"\b(?=\w)TEXTO\b(?!\w)", subject, re.IGNORECASE):
# Successful match
else:
# Match attempt failed
คำตอบ:
จากไพ ธ อน 3.6 คุณสามารถใช้การแก้ไขสตริงตัวอักษร "f-strings" ในกรณีเฉพาะของคุณการแก้ปัญหาจะเป็น:
if re.search(rf"\b(?=\w){TEXTO}\b(?!\w)", subject, re.IGNORECASE):
...do something
แก้ไข:
เนื่องจากมีคำถามในความคิดเห็นเกี่ยวกับวิธีจัดการกับตัวละครพิเศษฉันต้องการขยายคำตอบของฉัน:
สตริงดิบ ('r'):
หนึ่งในแนวคิดหลักที่คุณต้องเข้าใจเมื่อจัดการกับอักขระพิเศษในนิพจน์ทั่วไปคือการแยกแยะระหว่างตัวอักษรสตริงและนิพจน์ทั่วไป มันอธิบายได้ดีมากที่นี่ :
ในระยะสั้น:
สมมติว่าแทนการหาขอบเขตของคำ\b
หลังจากที่คุณต้องการเพื่อให้ตรงกับสตริงTEXTO
\boundary
คุณต้องเขียน:
TEXTO = "Var"
subject = r"Var\boundary"
if re.search(rf"\b(?=\w){TEXTO}\\boundary(?!\w)", subject, re.IGNORECASE):
print("match")
ใช้งานได้เพียงเพราะเราใช้ raw-string (regex นำหน้าด้วย 'r') มิฉะนั้นเราจะต้องเขียน "\\\\ ขอบเขต" ใน regex (แบ็กสแลชสี่อัน) นอกจากนี้หากไม่มี '\ r', \ b 'จะไม่แปลงเป็นคำอีกต่อไป แต่เป็น backspace!
re.escape :
โดยทั่วไปจะใส่ Backspace ไว้ด้านหน้าอักขระพิเศษ ดังนั้นหากคุณคาดหวังอักขระพิเศษใน TEXTO คุณต้องเขียน:
if re.search(rf"\b(?=\w){re.escape(TEXTO)}\b(?!\w)", subject, re.IGNORECASE):
print("match")
หมายเหตุ: สำหรับรุ่นใด ๆ > = 3.7 หลาม: !
, "
, %
, '
, ,
, /
, :
, ;
, <
, =
, >
, @
และ`
จะไม่หนี เฉพาะอักขระพิเศษที่มีความหมายใน regex เท่านั้นที่ยังคงใช้การได้ _
ไม่ได้หลบหนีตั้งแต่ Python 3.3 (s. ที่นี่ )
วงเล็บปีกกา:
หากคุณต้องการใช้ปริมาณภายในนิพจน์ปกติโดยใช้สตริง -f คุณต้องใช้เครื่องหมายปีกกาคู่ สมมติว่าคุณต้องการจับคู่ TEXTO แล้วตามด้วยตัวเลข 2 หลัก:
if re.search(rf"\b(?=\w){re.escape(TEXTO)}\d{{2}}\b(?!\w)", subject, re.IGNORECASE):
print("match")
fr"foo{{1,5}}"
(วงเล็บสองครั้ง)
คุณต้องสร้าง regex เป็นสตริง:
TEXTO = sys.argv[1]
my_regex = r"\b(?=\w)" + re.escape(TEXTO) + r"\b(?!\w)"
if re.search(my_regex, subject, re.IGNORECASE):
etc.
สังเกตการใช้งานre.escape
เพื่อที่ว่าหากข้อความของคุณมีอักขระพิเศษพวกเขาจะไม่ถูกตีความเช่นนั้น
r'' + foo + 'bar'
?
r''
ไม่จำเป็นถ้าคุณทำre.escape(foo)
ซึ่งคุณควรจะทำต่อไป ที่จริงแล้วฉันคิดว่าre
ตีความอะไรก็ตามที่มันได้รับเป็นยูนิโค้ดสตริงโดยไม่คำนึงว่าคุณจะใส่คำนำหน้าr
หรือไม่
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):
สิ่งนี้จะแทรกสิ่งที่อยู่ใน TEXTO ลงใน regex เป็นสตริง
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO)
ฉันคิดว่ามันสะดวกมากที่จะสร้างรูปแบบนิพจน์ปกติ
import re
string = "begin:id1:tag:middl:id2:tag:id3:end"
re_str1 = r'(?<=(\S{5})):'
re_str2 = r'(id\d+):(?=tag:)'
re_pattern = re.compile(re_str1 + re_str2)
match = re_pattern.findall(string)
print(match)
เอาท์พุท:
[('begin', 'id1'), ('middl', 'id2')]
ฉันเห็นด้วยทั้งหมดข้างต้นเว้นแต่:
sys.argv[1]
เป็นสิ่งที่ต้องการ Chicken\d{2}-\d{2}An\s*important\s*anchor
sys.argv[1] = "Chicken\d{2}-\d{2}An\s*important\s*anchor"
คุณไม่ต้องการใช้re.escape
เพราะในกรณีนี้คุณต้องการให้มันทำงานเหมือน regex
TEXTO = sys.argv[1]
if re.search(r"\b(?<=\w)" + TEXTO + "\b(?!\w)", subject, re.IGNORECASE):
# Successful match
else:
# Match attempt failed
ฉันต้องการค้นหาชื่อผู้ใช้ที่คล้ายกันและสิ่งที่ Ned Batchelder กล่าวมีประโยชน์อย่างเหลือเชื่อ อย่างไรก็ตามฉันพบว่าฉันมีเอาต์พุตที่สะอาดกว่าเมื่อฉันใช้ re.compile เพื่อสร้างข้อความค้นหาใหม่:
pattern = re.compile(r"("+username+".*):(.*?):(.*?):(.*?):(.*)"
matches = re.findall(pattern, lines)
สามารถพิมพ์งานได้โดยใช้สิ่งต่อไปนี้:
print(matches[1]) # prints one whole matching line (in this case, the first line)
print(matches[1][3]) # prints the fourth character group (established with the parentheses in the regex statement) of the first line.
คุณสามารถลองใช้งานอื่นได้โดยใช้format
grammer suger:
re_genre = r'{}'.format(your_variable)
regex_pattern = re.compile(re_genre)
คุณสามารถใช้รูปแบบคำหลักเช่นกันสำหรับวิธีนี้รูปแบบจะแทนที่ {} ตัวยึดตำแหน่งเป็นตัวแปรที่คุณส่งผ่านไปยังวิธีการจัดรูปแบบเป็นอาร์กิวเมนต์
if re.search(r"\b(?=\w)**{}**\b(?!\w)".**format(TEXTO)**, subject, re.IGNORECASE):
# Successful match**strong text**
else:
# Match attempt failed
ตัวอย่างเพิ่มเติม
ฉันมี configus.yml พร้อมไฟล์ flow
"pattern":
- _(\d{14})_
"datetime_string":
- "%m%d%Y%H%M%f"
ในรหัสหลามฉันใช้
data_time_real_file=re.findall(r""+flows[flow]["pattern"][0]+"", latest_file)