132

想知道最好的匹配方法"test.this""blah blah blah test.this@gmail.com blah blah"什么?使用 Python。

我试过了re.split(r"\b\w.\w@")

4

7 回答 7

212

正则表达式中的A.是一个元字符,它用于匹配任何字符。要匹配原始 Python 字符串 ( r""or r'') 中的文字点,您需要对其进行转义,因此r"\."

于 2012-12-21T11:51:20.130 回答
54

在您的正则表达式中,您需要转义"\."或在字符类 "[.]"中使用它,因为它是正则表达式中的元字符,它匹配任何字符。

此外,您需要\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']
于 2012-12-21T11:51:22.257 回答
14

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

所以,如果你想从字面上评估点,我认为你应该把它放在方括号中:

>>> p = re.compile(r'\b(\w+[.]\w+)')
>>> resp = p.search("blah blah blah test.this@gmail.com blah blah")
>>> resp.group()
'test.this'
于 2014-08-10T11:20:46.103 回答
1

要转义字符串变量的非字母数字字符,包括点,您可以使用re.escape

import re

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

输出:

whatever\.v1\.dfc

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

于 2020-07-07T12:56:25.367 回答
0

这是我对@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

参考:

  1. 主要和官方参考:https ://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals 在此处输入图像描述
  2. [@Sean Hammond 的回答]如何在 Python 中修复“<string> DeprecationWarning: invalid escape sequence”?

    如果要将文字\放在字符串中,则必须使用\\

于 2021-03-17T04:07:20.293 回答
-2

在 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]
于 2019-07-15T14:13:42.500 回答
-3

这个表情,

(?<=\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的右上角面板中进行了说明。如果您愿意,您还可以在此链接中观看它如何与一些示例输入匹配。


于 2019-10-17T18:32:17.953 回答