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

时间:2012-01-14 03:13:57

标签: python regex indexing

我有一个模式: “\ nvariable WORD”

这个模式在字符串中显示很多次,我想要一个这个模式显示的索引列表。 “WORD”是固定的,不会因实例而异,但“变量”的内容和长度各不相同。

在python中,我知道这匹配所有WORD并在列表中返回它们的索引:

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

简而言之,如何在\ n之后但在“WORD”之前找到所有“变量”的索引?

4 个答案:

答案 0 :(得分: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']

您需要索引什么?

答案 1 :(得分:2)

如果您知道的唯一工具是锤子,那么每个问题看起来都像钉子一样。

正则表达式是强有力的锤子,但有时不是手头任务的最佳工具。事实上,正则表达式被滥用了很多,每当有人要我检查来自其他程序员的复杂正则表达式时,我感到很震惊(通常我几周之后就无法理解)。

另一方面,EBNF(Extended Backus-Naur Form)符号更容易理解和维护。

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]

答案 2 :(得分:0)

您可能需要根据目标偏离起点的指数。如果由&#39; \ n&#39;你期待换行,那么你必须在编译中包含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()

答案 3 :(得分:0)

啊,好吧,事实证明文本实际上包含ctrl-M返回字符而不是换行符,这让我发疯了。我删除了那些,我刚用过:

[m.start() for m in re.finditer('\w+\sWORD',contents)]

感谢您的帮助!当然,Simpleparser也可以使用。