นิพจน์ทั่วไปเพื่อจับคู่จุด


94

ถูกสงสัยว่าวิธีที่ดีที่สุดคือการแข่งขัน"test.this"จาก"blah blah blah test.this@gmail.com blah blah"นั้นคืออะไร? ใช้ Python

ฉันได้ลองแล้ว re.split(r"\b\w.\w@")


\wจับคู่เฉพาะอักขระตัวเดียว - คุณอาจต้องการ\w+
Peter Boughton

2
นี่คือregex การตรวจสอบอีเมลหากคุณกำลังมองหา
chucksmash

คำตอบ:


162

A .ใน regex เป็นอักขระเมตาซึ่งใช้เพื่อจับคู่อักขระใด ๆ ในการจับคู่จุดตามตัวอักษรคุณต้องหลีกเลี่ยงจุดนั้น\.


44

ใน regex ของคุณคุณต้องหลีกเลี่ยงจุด"\."หรือใช้ในคลาสอักขระ "[.]"เนื่องจากเป็นอักขระเมตาใน regex ซึ่งตรงกับอักขระใด ๆ

นอกจากนี้คุณต้อง\w+แทนที่จะ\wจับคู่อักขระคำหนึ่งตัวขึ้นไป


ตอนนี้ถ้าคุณต้องการtest.thisเนื้อหาsplitนั่นไม่ใช่สิ่งที่คุณต้องการ splitจะแยกสตริงของคุณรอบ ๆ ไฟล์test.this. ตัวอย่างเช่น:

>>> re.split(r"\b\w+\.\w+@", s)
['blah blah blah ', 'gmail.com blah blah']

คุณสามารถใช้re.findall:

>>> re.findall(r'\w+[.]\w+(?=@)', s)   # look ahead
['test.this']
>>> re.findall(r'(\w+[.]\w+)@', s)     # capture group
['test.this']

2
+1 สำหรับคลาสตัวละคร การใช้ gcovr จาก Jenkinsfile และพยายามแยกไดเร็กทอรี dot ออกและ Jenkins ไม่เข้าใจลำดับการหลีกเลี่ยง คลาสตัวละครทำงานได้อย่างสวยงาม
Jonathan Landrum

13

"ในโหมดเริ่มต้น Dot (.) จะจับคู่อักขระใด ๆ ยกเว้นการขึ้นบรรทัดใหม่หากระบุแฟล็ก DOTALL ค่านี้จะจับคู่อักขระใด ๆ รวมถึงขึ้นบรรทัดใหม่ด้วย" (python Doc)

ดังนั้นหากคุณต้องการประเมิน dot literaly ฉันคิดว่าคุณควรใส่ไว้ในวงเล็บเหลี่ยม:

>>> p = re.compile(r'\b(\w+[.]\w+)')
>>> resp = p.search("blah blah blah test.this@gmail.com blah blah")
>>> resp.group()
'test.this'

1

ในการหลีกเลี่ยงอักขระที่ไม่ใช่ตัวเลขและตัวอักษรของตัวแปรสตริงรวมถึงจุดคุณสามารถใช้re.escape:

import re

expression = 'whatever.v1.dfc'
escaped_expression = re.escape(expression)
print(escaped_expression)

เอาต์พุต:

whatever\.v1\.dfc

คุณสามารถใช้นิพจน์ที่ใช้ Escape เพื่อค้นหา / จับคู่สตริงตามตัวอักษร


-1

ในจาวาสคริปต์คุณต้องใช้ \. เพื่อให้ตรงกับจุด

ตัวอย่าง

"blah.tests.zibri.org".match('test\\..*')
null

และ

"blah.test.zibri.org".match('test\\..*')
["test.zibri.org", index: 5, input: "blah.test.zibri.org", groups: undefined]

มันขอ python ไม่ใช่ JS
pl-jay

-2

สำนวนนี้

(?<=\s|^)[^.\s]+\.[^.\s]+(?=@)

อาจทำงานได้ดีสำหรับสตริงอินพุตประเภทเฉพาะเหล่านั้น

การสาธิต

ทดสอบ

import re

expression = r'(?<=^|\s)[^.\s]+\.[^.\s]+(?=@)'
string = '''
blah blah blah test.this@gmail.com blah blah
blah blah blah test.this @gmail.com blah blah
blah blah blah test.this.this@gmail.com blah blah
'''

matches = re.findall(expression, string)

print(matches)

เอาต์พุต

['test.this']

หากคุณต้องการที่จะลดความซับซ้อน / การแก้ไข / การสำรวจการแสดงออกก็ถูกอธิบายอยู่ด้านบนขวาของแผงregex101.com หากคุณต้องการคุณสามารถดูในลิงค์นี้ว่าจะจับคู่กับอินพุตตัวอย่างบางส่วนอย่างไร


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