2

複数行の文字列があり、Python で正規表現を適用したいと考えています。正規表現が一致した行を見つける方法はありますか?

たとえば、正規表現を使用した場合

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

弦の上

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

0どうすればその行を見つけて1一致させることができますか? regex.findall(s)すべての一致のリストが表示されますが、これらの一致がどの行にあるかはわかりません。

4

5 に答える 5

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())
    ...
于 2013-07-06T12:12:07.177 に答える
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)

于 2013-07-06T12:03:24.877 に答える
3

簡単な方法の 1 つは、代替一致改行です。

lineno=1
for m in re.findall(r'\n|(?<=i)s', s):
    if m != '\n': print lineno, m
    else : lineno += 1
于 2013-07-06T12:22:11.950 に答える
2

を使用するre.MULTILINEと、キャレット ( ^) は文字列の先頭と行の先頭に一致します。正規表現を少し変更すると、一致しなかった空の文字列を含むすべての行のリストが表示されます。

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

行番号は、インデックスに文字列が空でないリストの 1 つを加えたものです。

>>> [(i + 1, j) for (i, j) in enumerate(regex.findall(s)) if j != '']
[(1, 'This'), (2, 'is')]
于 2013-07-06T12:24:20.453 に答える