在Python中正则表达式匹配单词前的换行符

1 投票
4 回答
1755 浏览
提问于 2025-04-17 10:13

我有一个模式:

"\nvariable WORD"

这个模式在字符串中出现了很多次,我想要一个列表,里面记录这个模式出现的位置。这里的"WORD"是固定的,不会变化,但"variable"的内容和长度是不同的。

在Python中,我知道可以匹配所有的"WORD",并返回它们在列表中的索引:

contents="some long string"
print [m.start() for m in re.finditer('WORD',contents)]

所以简单来说,我该如何找到所有在\n之后但在"WORD"之前的"variable"的索引呢?

4 个回答

0

根据你的目标,你可能需要调整一下起始点的索引。如果你是想通过'\n'来表示换行的话,那么在编译的时候就需要加上MULTILINE这个标志。

import re

mytext='\nvar1 WORD\nvar2 WORD\nvar3 WORD'
#compile a pattern to find the 'var*' after \n
pat = re.compile('\n(.*?)\s+WORD')

results = re.finditer(pat,mytext)

for result in results:
    print result.start()
2

这样可以吗?

>>> import re
>>> s = '\nvariable1 WORD\nvariable2 WORD\nvariable3 WORD\nvariable4 WORD\nvariable5 WORD'
>>> re.findall(r'\n(\w+)\s+WORD', s)
['variable1', 'variable2', 'variable3', 'variable4', 'variable5']

你需要这些索引来做什么呢?

3

如果你只会用锤子,那你看到的每个问题都像是钉子。

正则表达式就像是强力锤子,但有时候并不是解决问题的最佳工具。实际上,很多人都滥用正则表达式,每当有人让我检查其他程序员写的复杂正则表达式时,我都感到一阵不安(通常过几周我连自己写的都看不懂)。

另一方面,EBNF(扩展巴科斯-诺尔范式)表示法要简单得多,容易理解和维护。

from simpleparse.parser import Parser

grammar = r"""
<space>      := [ \t]
<newline>    := '\n'
<identifier> := [A-Za-z_],[A-Za-z0-9z_]*
match        := newline,identifier,space+,'WORD'
<junk>       := newline*,identifier,space+,-'WORD',(identifier/space)*
data         := (match/junk)*
"""

parser = Parser(grammar, 'data')

data = 'some junk\nvariable1 WORD\nvariable2 some ' +\
       'junk\nvariable3 WORD\nvariable4 some other ' +\
       'junk\nvariable5 WORD'

(start, matches, stop) = parser.parse(data)

print [ start for name, start, stop, other in matches ]

这将打印:

[9, 44, 85]

撰写回答