与正则表达式行匹配

Posted

技术标签:

【中文标题】与正则表达式行匹配【英文标题】:Matching with regex line for line 【发布时间】:2016-02-16 19:19:06 【问题描述】:

我正在使用文件中的正则表达式匹配行来开发一种有趣的小语言。这是我目前所拥有的:

import re

code=open("code.txt", "r").read()

outputf=r'output (.*)'
inputf=r'(.*) = input (.*)'
intf=r'int (.*) = (\d)'
floatf=r'float (.*) = (\d\.\d)'
outputq=re.match(outputf, code)
if outputq:
    print "Executing OUTPUT query"
    exec "print %s" %outputq.group(1)

inputq=re.match(inputf, code)
if inputq:
    print "Executing INPUT query"
    exec "%s=raw_input(%s)"%(inputq.group(1), inputq.group(2))

intq=re.match(intf, code)
if intq:
    exec "%s = %s"%(intq.group(1), intq.group(2))
    exec "print %s"%(intq.group(1))
else:
    print "Invalid syntax"

代码匹配说:

int x = 1

但它只会匹配第一行并停止匹配并忽略我想要匹配的其余代码。如何将文件中的每一行与我的正则表达式定义相匹配?

【问题讨论】:

你的问题我不清楚,请尽量集中说明你想要实现的什么,而不是如何你想做什么所以。请仅发布相关代码(即,如果您遇到正则表达式匹配问题 - 仅发布处理正则表达式和输入的相关行)。 我也不确定你想做什么,但如果你正在使用编程语言,你可能想知道正则表达式不适合那个 - 请参阅en.wikipedia.org/wiki/Chomsky_hierarchy#The_hierarchy - 你可能要考虑使用语法或至少看看这个:nedbatchelder.com/text/python-parsers.html 【参考方案1】:

.read() 读为一行,在.read() 代码上使用.split("\n") 或使用.readlines()

然后遍历这些行并测试您的命令。 目前,您将整个代码视为一行。您想逐行检查所有行。

编辑:

为此,创建一个函数

然后用 readlines() 读取行

最后遍历行,使用行上的函数

这样:

import re

outputf=r'output (.*)'
inputf=r'(.*) = input (.*)'
intf=r'int (.*) = (\d)'
floatf=r'float (.*) = (\d\.\d)'

def check_line(line):
    outputq=re.match(outputf, line)
    if outputq:
        print ("Executing OUTPUT query")
        exec ("print (%s)" % outputq.group(1))

    inputq=re.match(inputf, line)
    if inputq:
        print ("Executing INPUT query")
        exec ("%s=raw_input(%s)"%(inputq.group(1), inputq.group(2)))

    intq=re.match(intf, line)
    if intq:
        exec ("%s = %s"%(intq.group(1), intq.group(2)))
        exec ("print (%s)"%(intq.group(1)))
    else:
        print ("Invalid syntax")


code=open("code.txt", "r").readlines()

for line in code:
    check_line(line)

这段代码仍然会返回一个错误,这与问题无关,考虑一下你是否正确地分配了变量。

【讨论】:

你能帮帮我写一点吗? return _compile(pattern, flags).m​​atch(string) TypeError: expected string or buffer 当然,您必须将match() 中的“代码”变量替换为已编辑的行 让我们continue this discussion in chat。【参考方案2】:

您正在使用re.match(),这意味着您的正则表达式必须匹配整个字符串(在这种情况下是整个文件)。如果您遍历文件中的每一行,那么.match() 将起作用。或者,您可能想查看re.search()re.findall() 和其他类似的替代方案。

您的代码似乎需要遍历文件中的行:How to iterate over the file in python

【讨论】:

以上是关于与正则表达式行匹配的主要内容,如果未能解决你的问题,请参考以下文章

从文件中读取索引“n”低于与给定正则表达式匹配的行的所有行

.Net 正则表达式匹配 $ 与字符串的结尾而不是行的结尾,即使启用了多行

删除不包含与 Python 匹配的正则表达式的单元格/行

提取文件中匹配正则表达式的所有行

检查行是不是匹配正则表达式

5.2.1 正则表达式语法与子模式扩展语法