我的正则表达式适用于regex101,但在python中不起作用?

时间:2016-12-15 02:56:15

标签: python regex

所以我需要匹配|包围的字符串。那么,模式应该只是r"\|([^\|]*)\|",对吗?然而:

>>> pattern = r"\|([^\|]*)\|"
>>> re.match(pattern, "|test|")
<_sre.SRE_Match object at 0x10341dd50>
>>> re.match(pattern, "  |test|")
>>> re.match(pattern, "asdf|test|")
>>> re.match(pattern, "asdf|test|1234")
>>> re.match(pattern, "|test|1234")
<_sre.SRE_Match object at 0x10341df30>

它仅匹配以|开头的字符串?它在regex101上工作正常,如果重要的话,这是python 2.7。我可能只是在这里做一些蠢事,所以任何帮助都会受到赞赏。谢谢!

3 个答案:

答案 0 :(得分:4)

re.match将希望匹配从头开始的字符串。在您的情况下,您只需要匹配元素,对吗?在这种情况下,您可以使用re.searchre.findall之类的内容,它会在字符串中的任何位置找到匹配项:

>>> re.search(pattern, "  |test|").group(0)
'|test|'

>>> re.findall(pattern, "  |test|")
['test']

答案 1 :(得分:2)

Python基于正则表达式提供两种不同的基本操作:re.match()仅检查匹配 在字符串的开头,re.search()检查字符串中的任何位置(这是Perl所做的) 默认情况下)。

Document

答案 2 :(得分:2)

为了重现在https://regex101.com/上运行的代码,您必须单击左侧的Code Generator。这将向您显示他们的网站正在使用什么。在这里,您可以使用标志或re中需要的功能。

注意:

import re

regex = r"where"

test_str = "select * from table where t=3;"

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))