我正在使用文件中使用正则表达式匹配行创建一个有趣的小语言。以下是我到目前为止的情况:
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
但它只匹配第一行并停止匹配并忽略我想要匹配的其余代码。如何将文件中的每一行与我的正则表达式定义相匹配?
答案 0 :(得分:3)
.read()
读取为一行,在.split("\n")
代码上使用.read()
或使用.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)
此代码仍会返回错误,这与问题无关,请考虑是否正确分配变量。
答案 1 :(得分:1)
您正在使用dispatch_after
,这意味着您的正则表达式必须匹配整个字符串(在本例中是整个文件)。如果迭代文件中的每一行,那么re.match()
将起作用。或者,您可能需要查看.match()
,re.search()
和其他类似的替代方案。
看起来您的代码需要遍历文件中的行:How to iterate over the file in python