想知道最好的匹配方法"test.this"
是"blah blah blah test.this@gmail.com blah blah"
什么?使用 Python。
我试过了re.split(r"\b\w.\w@")
正则表达式中的A.
是一个元字符,它用于匹配任何字符。要匹配原始 Python 字符串 ( r""
or r''
) 中的文字点,您需要对其进行转义,因此r"\."
在您的正则表达式中,您需要转义点"\."
或在字符类 "[.]"
中使用它,因为它是正则表达式中的元字符,它匹配任何字符。
此外,您需要\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']
“在默认模式下,点 (.) 匹配除换行符以外的任何字符。如果指定了 DOTALL 标志,则匹配包括换行符在内的任何字符。” (蟒蛇文档)
所以,如果你想从字面上评估点,我认为你应该把它放在方括号中:
>>> p = re.compile(r'\b(\w+[.]\w+)')
>>> resp = p.search("blah blah blah test.this@gmail.com blah blah")
>>> resp.group()
'test.this'
要转义字符串变量的非字母数字字符,包括点,您可以使用re.escape
:
import re
expression = 'whatever.v1.dfc'
escaped_expression = re.escape(expression)
print(escaped_expression)
输出:
whatever\.v1\.dfc
您可以使用转义表达式从字面上查找/匹配字符串。
这是我对@Yuushi 的主要答案的补充:
请记住,如果在常规字符串 ( or ) 而不是原始字符串( or ) 中使用反斜杠 ( \
) 字符本身,则必须在 Python 中对其进行转义。因此,请记住您使用的字符串类型。因此,要在常规 Python 字符串中转义正则表达式中的点或句点 ( ),您还必须使用双反斜杠 () 转义反斜杠,使正则表达式中的总转义序列为: ,如图所示在下面的例子中。'some string'
"some string"
r'some string'
r"some string"
.
\\
.
\\.
因此,这些是不允许的。他们会引起这样的警告:
弃用警告:无效的转义序列
\.
'\.' # NOT a valid escape sequence in Python
"\." # NOT a valid escape sequence in Python
所有这些都是允许的并且是等效的:
# Use a DOUBLE BACK-SLASH in Python _regular_ strings
'\\.' # Python regular string
"\\." # Python regular string
# Use a SINGLE BACK-SLASH in Python _raw_ strings
r'\.' # Python raw string
r"\." # Python raw string
如果要将文字
\
放在字符串中,则必须使用\\
在 javascript 中,你必须使用\\.
来匹配一个点。
例子
"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]
这个表情,
(?<=\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的右上角面板中进行了说明。如果您愿意,您还可以在此链接中观看它如何与一些示例输入匹配。