Python 使正则表达式不匹配它看到的每个字符

Python 使正则表达式不匹配它看到的每个字符,python,regex,interpreter,Python,Regex,Interpreter,我正在试着做一个简单的翻译,现在我必须起名字,但是 当我尝试使用regex时,它匹配所有字符: “你好,世界”:[“H”、“e”、“l”、“l”、“o”、“W”、“o”、“r”、“l”、“d”] 但我希望它能像这样匹配: “你好,世界”:[“你好”,“世界”] 我试过的正则表达式:[a-zA-Z_][a-zA-Z_0-9]* 我无法使用拆分,因为我正在尝试逐字符执行此操作 我的代码: 重新导入 代币=[] 类令牌: 定义初始化(self,id,val,type=“NA”): self.id=id

我正在试着做一个简单的翻译,现在我必须起名字,但是 当我尝试使用regex时,它匹配所有字符:
“你好,世界”:[“H”、“e”、“l”、“l”、“o”、“W”、“o”、“r”、“l”、“d”]
但我希望它能像这样匹配:
“你好,世界”:[“你好”,“世界”]

我试过的正则表达式:[a-zA-Z_][a-zA-Z_0-9]*

我无法使用拆分,因为我正在尝试逐字符执行此操作

我的代码:

重新导入
代币=[]
类令牌:
定义初始化(self,id,val,type=“NA”):
self.id=id
self.val=val
self.type=type
def lex(数据):
数据=列表(数据)
tok=“”
var_name=“”
对于idx,枚举中的字符(数据):
tok+=char
#丢弃
如果tok==“”:
tok=“”
elif tok==“\n”:
tok=“”
关于匹配(r“(?s)\(\*.\*\)”,tok)的省略:
tok=“”
#关键词
elif tok==“打印”:
标记。附加(标记(“打印”,tok))
tok=“”
#规则
关于匹配(r“\”*\”,tok)的省略:
附加(Token(“STR”,tok,“expr”))
tok=“”
#这就是问题所在
关于匹配的省略(r“[a-zA-Z_][a-zA-Z_0-9]*”,tok):
如果数据[idx]==“”或数据[idx]==“\n”:
tokens.append(Token(“NAME”,var_NAME,“expr”))
tok=“”
其他:
var_name+=tok
tok=“”
打印(tok)
归还代币
编辑:
大家好,我解决了这个问题,我没有一个字符一个字符地进行匹配,而是使用了split,虽然效率不高,但它很有效。

如果您希望匹配的字符是“Hello”,那么您需要匹配多个字符。 您可以将“Hello world!”与regex
\w*\b
匹配以获取所有单词<代码>\b与单词边界匹配。你可以看看它是如何工作的


如果你真的需要一个字符一个字符地做这件事,那么你需要另一种机制来为你找到单词的边界。

我解决了这个问题,不是一个字符一个字符地做,而是使用了拆分,虽然效率不高,但很有效


谢谢所有评论的人。

尝试<代码> Re.FunDALL('W+',“Hello World”)< /C> >您尝试匹配每个字符,而不是仅当您获得完整的令牌时。您这样做的方式,一旦匹配了一个正则表达式,就可以考虑完成令牌。这种方法是行不通的,因为它总是喜欢最短的匹配,而不是最长的匹配。如果你想像这样逐字符进行,你需要在添加下一个字符时完成标记,这样它们就不再匹配任何正则表达式,并且不能通过添加更多字符来匹配它们。除非你不能用普通的正则表达式来做这件事,因为你不能查看它们的实现并检查它们是否达到了失败状态。所以你要么离开正则表达式,使用状态机,要么离开逐字符的方法,使用正则表达式来查找剩余输入的前缀。我想问假设使用
split
效率较低。然而,对于大多数语言,我要说的是,要使
split
按照语言的词汇规则产生正确的结果是非常困难的。