正则表达式匹配点

时间:2012-12-21 11:49:35

标签: python regex

想知道从“blah blah blah test.this@gmail.com blah blah”匹配“test.this”的最佳方法是什么?使用Python。

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

谢谢!

7 个答案:

答案 0 :(得分:104)

正则表达式中的.是元字符,用于匹配任何字符。要匹配文字点,您需要将其转义,\.

答案 1 :(得分:26)

regex中,您需要转义dot(.) - "\."或在character class - "[.]"内使用它,因为它是正则表达式中的元字符,可与任何字符匹配。

此外,您需要\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 :(得分:10)

  

“在默认模式下,Dot(。)匹配除换行符之外的任何字符。如果指定了DOTALL标志,则匹配任何包含换行符的字符。” (python Doc)

所以,如果你想对文字进行评估,我认为你应该把它放在方括号中:

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

答案 3 :(得分:1)

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

import re

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

输出:

whatever\.v1\.dfc

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

答案 4 :(得分:0)

在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]

答案 5 :(得分:0)

此表达式

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

对于那些特定类型的输入字符串也可以正常工作。

Demo

测试

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的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。


答案 6 :(得分:0)

这是我对 the main answer by @Yuushi 的附加组件:

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

因此,这些是不允许的。他们会发出类似这样的警告:

<块引用>

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

'\.'   # 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. 主要和官方参考:raw string https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals
  2. [@Sean Hammond 的回答] enter image description here <块引用>

    如果您想在字符串中放置文字 \,您必须使用 \\