Python 匹配点的正则表达式

Python 匹配点的正则表达式,python,regex,Python,Regex,我想知道什么是匹配测试的最佳方法。这是中的“”诸如此类的测试。this@gmail.com废话废话“是什么?使用Python 我试过re.split(r“\b\w.\w@”)A在正则表达式中是一个元字符,用于匹配任何字符。要匹配原始Python字符串(r”“或r”“)中的文字点,您需要对其进行转义,因此r“\”在正则表达式中,您需要转义点“\。或在字符类中使用它,因为它是正则表达式中的元字符,它匹配任何字符 此外,您需要使用\w+而不是\w来匹配一个或多个单词字符 现在,如果您想要测试。这是内

我想知道什么是匹配
测试的最佳方法。这是
中的“
”诸如此类的测试。this@gmail.com废话废话“
是什么?使用Python


我试过
re.split(r“\b\w.\w@”)
A
在正则表达式中是一个元字符,用于匹配任何字符。要匹配原始Python字符串(
r”“
r”“
)中的文字点,您需要对其进行转义,因此
r“\”
在正则表达式中,您需要转义
“\。
或在字符类中使用它,因为它是正则表达式中的元字符,它匹配任何字符

此外,您需要使用
\w+
而不是
\w
来匹配一个或多个单词字符


现在,如果您想要
测试。这是
内容,那么
split
不是您需要的
split
将在
测试周围分割字符串。此
。例如:

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

您可以使用:

“在默认模式下,点(.)匹配除换行符以外的任何字符。如果指定了点all标志,则它匹配包括换行符在内的任何字符。”(python文档)

所以,如果你想用文字来计算dot,我认为你应该把它放在方括号内:

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

在javascript中,必须使用
\\.
来匹配点

范例

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

这句话,

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

如果您希望简化/修改/探索表达式,将在的右上面板中进行解释。如果您愿意,还可以在中查看它与一些示例输入的匹配情况



要对字符串变量的非字母数字字符(包括点)进行转义,可以使用
re.escape

import re

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

which\.v1\.dfc

您可以使用转义表达式逐字查找/匹配字符串。

以下是我的附加功能:

请记住,如果在常规字符串(
\
“some string”
“some string”
)中使用反斜杠(
r'some string'
r“some string”
)字符本身,则必须在Python中转义。因此,请记住您使用的字符串类型。因此,要在正则python字符串中转义正则表达式中的点或句点(
),还必须使用双反斜杠(
\\
)转义反斜杠,使正则表达式中的
的总转义序列为:
\.
,如下例所示

因此,这些是不允许的。它们会引起类似这样的警告:

弃用警告:转义序列无效。
\。

“\.”在Python中不是有效的转义序列
“\。”在Python中不是有效的转义序列
所有这些都是允许的,并且是等效的:

#在Python规则字符串中使用双反斜杠
“\\.”Python正则字符串
“\\.”Python正则字符串
#在Python原始字符串中使用一个反斜杠
r'\.\Python原始字符串
r“\.”Python原始字符串
参考资料:
  • 主要和官方参考:
  • [答复@Sean Hammond] 如果要将文本
    \
    放入字符串中,则必须使用
    \


  • \w
    只匹配一个字符-您可能需要
    \w+
    如果您正在寻找一个字符,请参见:+1以获取字符类。从Jenkins文件中使用gcovr并试图排除点目录,Jenkins不理解转义序列。character类工作得很好。它要求python而不是JS,除非正则表达式存储在正则python字符串中,在这种情况下,您需要使用double
    \
    \\
    )。所以,所有这些都是等价的:
    “\\.
    ”\.
    r'\.
    r'\.
    。请参阅:。我继续并添加了一个答案:。@GabrielStaples次要挑剔--
    r“…
    语法是Python的“原始”字符串,而不是“常规”字符串。@GrandOpener,正确,正如我解释的(请看一看)。请重新阅读我上面的评论。我说过,常规字符串需要双斜杠:
    '\\.
    “\\.”
    ,而原始字符串需要单斜杠:
    r'\.
    r'\.
    ,这正是我评论的重点。这个答案并不清楚。我想在我的评论中向任何使用常规字符串的人说明这一点,因为这个答案只适用于原始字符串。@GrandOpener,我已经更新了Yuushi的答案,以明确他或她的答案只适用于原始字符串。欢迎Yuushi编辑他的答案,如果他愿意的话,以显示常规字符串如何需要两个反斜杠。(我正在尽量减少对他的答案的修改。)
    (?<=\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']
    
    import re
    
    expression = 'whatever.v1.dfc'
    escaped_expression = re.escape(expression)
    print(escaped_expression)