gpt4 book ai didi

python - re.scanner 只搜索字符串的开头

转载 作者:太空宇宙 更新时间:2023-11-04 10:43:11 26 4
gpt4 key购买 nike

我刚刚了解到 re.Scanner同时寻找方法来解析一系列在定义上可能有点灵活的行。它看起来(不知道它的意思)就像它正是我想要的,但我遇到了问题。

我定义我的扫描仪:

scanner = re.Scanner([
(r"([0-9]+(?:\ h|h))", lambda scanner,token:("HOURS", token)),
])

results, remainder = scanner.scan(line)

它应该能够在提供的字符串中找到类似“1h”或“1 h”的内容。但是,这仅在小时位于字符串开头时才有效。

传入:

1 h words words words
bla 2 h words words

只有第一个条目被解析为一个小时。在无法阅读 Scanner 的情况下,我认为它能够在提供的字符串中的任何位置找到匹配项,但看起来它只是在开头。它似乎也忽略了许多标准的正则表达式控件(例如 () 用于捕获和 (?:) 用于非捕获。

我应该找别的地方吗?使用一个看起来不会进入 Python 正式版本的类是不是一个坏主意?

最佳答案

Scanner.scan 确实从行首开始,并且要求它的每一位都匹配某种模式。 scan 方法在没有任何模式匹配的第一个点停止,字符串的其余部分作为 remainder 返回。

如果你想跳过任何不匹配的东西,就放

(r'.', lambda scanner, token: None),

在模式/函数列表的末尾。


Scanner 类已经在标准库中存在多年了(at least as far back as 2003),只是没有文档记录(还没有?)。

我认为您不必担心它会很快消失。即使它消失了,Scanner 类的定义也很短并且是 right here .


import re
line = '''\
1 h words words words
bla 2 h words words
'''

scanner = re.Scanner([
(r"([0-9]+(?:\ h|h))", lambda scanner, token: ("HOURS", token)),
(r'.', lambda scanner, token: None),
], flags=re.DOTALL)

results, remainder = scanner.scan(line)
print(results)

产量

[('HOURS', '1 h'), ('HOURS', '2 h')]

关于python - re.scanner 只搜索字符串的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19280898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com