为了账号安全,请及时绑定邮箱和手机立即绑定

re.findall 返回正确数量的匹配,但所有空字符串

re.findall 返回正确数量的匹配,但所有空字符串

SMILET 2022-05-19 14:00:31
我正在尝试在一串 PL/FOL 公式中构建文字列表,并且相关的代码正在查找匹配项,但将它们作为空白返回。我试过re.escape(formula)了,什么也没做。我也尝试过该findall模式的简单变体,但它们随后会生成空列表。def clean(formula):    formula = formula.strip()    formula = re.sub("\( +", "(", formula)    formula = re.sub(" +\)", ")", formula)    formula = re.sub("(?P<b_ops>[&v→↔])", " " + "\g<b_ops>" + " ", formula)    formula = re.sub("[ ]+", " ", formula)    # Make an inventory of literals for the original formula.    orig_lit_inv = re.findall("[~]*[A-Z]([a-u]|[w-z]){0,}", formula)    print(orig_lit_inv)this_WFF = "(P) & ~(~(Q → (R & ~S)))"clean(formula=this_WFF)当我打印结果时,我得到['', '', '', '']. 换句话说,它正在查找匹配项,但返回空白字符串作为匹配项,此时它至少应该返回[A-Z]. 以this_WFF作为参数,clean(formula)应该打印['P', 'Q', 'R', '~S'].
查看完整描述

1 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

引用re.findall的文档

如果模式中存在一个或多个捕获组,则返回组列表;如果模式有多个组,这将是一个元组列表。

您的正则表达式包含一个捕获组,因此findall永远不会为[A-Z]正则表达式返回任何内容。更改([a-u]|[w-z])(?:[a-u]|[w-z])查看差异:

>>> this_WFF = "(P) & ~(~(Q → (R & ~S)))"

>>> def clean(formula):

...     formula = formula.strip()

...     formula = re.sub("\( +", "(", formula)

...     formula = re.sub(" +\)", ")", formula)

...     formula = re.sub("(?P<b_ops>[&v→↔])", " " + "\g<b_ops>" + " ", formula)

...     formula = re.sub("[ ]+", " ", formula)

...     # Make an inventory of literals for the original formula.

...     orig_lit_inv = re.findall("[~]*[A-Z]([a-u]|[w-z]){0,}", formula)

...     print(orig_lit_inv)

... 

>>> clean(this_WFF)

['', '', '', '']

>>> def clean(formula):

...     formula = formula.strip()

...     formula = re.sub("\( +", "(", formula)

...     formula = re.sub(" +\)", ")", formula)

...     formula = re.sub("(?P<b_ops>[&v→↔])", " " + "\g<b_ops>" + " ", formula)

...     formula = re.sub("[ ]+", " ", formula)

...     # Make an inventory of literals for the original formula

...     orig_lit_inv = re.findall("[~]*[A-Z](?:[a-u]|[w-z]){0,}", formula)

...     print(orig_lit_inv)

... 

>>> clean(this_WFF)

['P', 'Q', 'R', '~S']

由于现在正则表达式不包含捕获组findall,因此只需在结果中返回“组 0”(即整个匹配项)的内容。


查看完整回答
反对 回复 2022-05-19
  • 1 回答
  • 0 关注
  • 420 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号