[英]Regex matching newline before word in python
我有一个模式:“ \\ nvariable WORD”
该模式在字符串中显示了很多次,我想要该模式显示的索引列表。 “ WORD”是固定的,并且在实例之间没有变化,但是“ variable”的内容和长度有所不同。
在python中,我知道这匹配所有WORD并在列表中返回其索引:
contents="some long string"
print [m.start() for m in re.finditer('WORD',contents)]
简而言之, 如何找到\\ n之后但“ WORD”之前所有“变量”的索引?
这足够吗?
>>> 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']
您需要什么索引?
如果您知道的唯一工具是锤子,那么每个问题都像钉子。
正则表达式是强大的工具,但有时并不是执行任务的最佳工具。 实际上,正则表达式被滥用很多,每当有人要求我从其他程序员那里检查复杂的正则表达式时,我都会感到不寒而栗(通常几周后我就无法理解我的意思)。
另一方面,EBNF(扩展Backus–Naur格式)表示法更易于理解和维护。
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]
您可能需要根据目标从起点偏移索引。 如果希望通过'\\ 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()
嗯,事实证明,该文本实际上包含ctrl-M返回字符而不是换行符,这使我发疯。 我删除了那些,我只是使用了:
[m.start() for m in re.finditer('\w+\sWORD',contents)]
感谢您的所有帮助! 当然,Simpleparser也可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.