如何找出正则表达式匹配的行?

时间:2013-07-06 10:46:27

标签: python regex

我有一个多行字符串,并希望在Python中将正则表达式应用于它。有没有办法找出正则表达式匹配的哪一行?

例如,如果我使用了正则表达式

regex = re.compile("(?<=i)s")

字符串

s = """This
is
a multiline
string"""

我如何才能找到与01匹配的行? regex.findall(s)为我提供了所有匹配项的列表,但它没有告诉我这些匹配项在哪一行。

5 个答案:

答案 0 :(得分:4)

如果您使用regex.finditer,则可以获得如下行号:

regex = re.compile("(?<=i)s")
s = """This
is
a multiline
string"""
for match in regex.finditer(s):
    lineno = s.count('\n', 0, match.start())
    ...

答案 1 :(得分:3)

您可以使用enumerate()获取行号:

>>> regex = re.compile("(?<=i)s")
>>> results = []
>>> for lineno, line in enumerate(s.split("\n")):
...     if regex.search(line):
...         results.append((lineno, line))
...
>>> results
[(0, 'This'), (1, 'is')]

当然,如果您自己不需要该行的内容,只需执行results.append(lineno)

答案 2 :(得分:3)

一种简单的方法是替代匹配换行符:

lineno=1
for m in re.findall(r'\n|(?<=i)s', s):
    if m != '\n': print lineno, m
    else : lineno += 1

答案 3 :(得分:2)

如果您使用re.MULTILINE,则插入符号(^)会匹配字符串的开头和行的开头。稍微改变你的正则表达式,会给你一个所有行的列表,一个你不匹配的空字符串:

>>> regex = re.compile("(^.*(?<=i)s|^)", re.MULTILINE)
>>> regex.findall(s)
['This', 'is', '', '']

行号是索引加上字符串不为空的列表之一:

>>> [(i + 1, j) for (i, j) in enumerate(regex.findall(s)) if j != '']
[(1, 'This'), (2, 'is')]

答案 4 :(得分:1)

对于您在评论中提到的第二个问题,

您可以使用reStringIO

进行操作
import re
from StringIO import StringIO

s = """This
is
a multiline
string.
This is a line with several "is\""""

print s

rgx = re.compile("(?<=i)s")

def graou(s):
    sl = 0
    for i,line in enumerate(StringIO(s)):
        tu = tuple(sl+m.start() for m in rgx.finditer(line))
        if tu: yield (i,tu)
        sl += len(line)

print [x for x in graou(s) if x[1]]

仅限re(我更喜欢):

import re

s = """This
is
a multiline
string.
This is a line with several "is\""""

print s

rgx = re.compile('$|(?<=i)s',re.MULTILINE)

def graou(s):
    i,li = 0,[]
    for m in rgx.finditer(s):
        if m.group()!='':
            li.append(m.start())
        elif li:
            yield((i,tuple(li)))
            i += 1
            li = []