繁体   English   中英

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

[英]re.scanner only searching start of string

我刚刚学习了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类已经在标准库中存在了很多年( 至少早在2003年 ),它只是没有记录(但是?)。

我认为你不必担心它会很快消失。 即使它消失了, Scanner类的定义也很短, 就在这里


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')]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM