【发布时间】:2021-11-30 23:52:20
【问题描述】:
我正在创建一个函数,它将接受像“three()”或类似“{1 + 2}”这样的字符串并将它们放入令牌列表中(例如:“three()”= [“three ", "(", ")"] 我使用 re.match 来帮助分隔字符串。
def lex(s):
# scan input string and return a list of its tokens
seq = []
patterns = (r"^(\t|\n|\r| )*(([a-z])*|[0-9]|\(|\)|\*|\/|)(\t|\n|\r| )*")
m = re.match(patterns,s)
while m != None:
if s == '':
break
seq.append(m.group(2))
s = s[len(m.group(0)):]
m = re.match(patterns,s)
return seq
如果字符串只是“三”,则此方法有效。但是如果字符串包含“()”或任何符号,它就会停留在 while 循环中。 但是当在模式字符串中移动 ([a-z])* 时会发生一件有趣的事情。为什么会这样?
works: patterns = (r"^(\t|\n|\r| )*([0-9]|\(|\)|\*|\/|([a-z])*)(\t|\n|\r| )*")
Does not work: patterns = (r"^(\t|\n|\r| )*(([a-z])*|[0-9]|\(|\)|\*|\/)(\t|\n|\r| )*")
【问题讨论】:
标签: python python-3.x python-re