Evan Fosmark已经给出了一个很好的答案,这只是更多的信息。
你有此行:
pattern = "6 of(.*)fans"
一般来说,这不是一个好的正则表达式。如果输入文本是:
"6 of 99 fans in the whole galaxy of fans"
那么匹配组(括号内的内容)将是:
" 99 fans in the whole galaxy of "
因此,我们需要一个模式,即使像上面那样愚蠢的输入文本,也能抓取你想要的内容。
在这种情况下,匹配空格并不重要,因为当你将字符串转换为整数时,空格会被忽略。但让我们编写一个忽略空格的模式。
使用通配符*,可以匹配长度为零的字符串。在这种情况下,我认为你总是想要一个非空匹配,所以你需要使用+来匹配一个或多个字符。
Python提供了非贪婪匹配,因此你可以用它来重新编写。旧的带有正则表达式的程序可能没有非贪婪匹配,因此我还将提供一个不需要非贪婪匹配的模式。
因此,非贪婪模式:
pattern = "6 of\s+(.+?)\s+fans"
另一个:
pattern = "6 of\s+(\S+)\s+fans"
\s
表示 "任何空格",会匹配空格、制表符和一些其他字符(例如 "换页符")。\S
表示 "任何非空格",会匹配任何 \s
不匹配的内容。
第一个模式比你的第一个模式做得更好,即使输入文本很奇怪:
"6 of 99 fans in the whole galaxy of fans"
它将返回一个匹配组,只包含 99
。
但试试这个奇怪的输入文本:
"6 of 99 crazed fans"
它将返回一个匹配组,包含 99 crazed
。
第二个模式将完全不匹配,因为单词 "crazed" 不是单词 "fans"。
嗯。这里有一个最后的模式,即使在奇怪的输入文本中也应该总是正确的:
pattern = "6 of\D*?(\d+)\D*?fans"
\d
匹配任何数字('0'
到 '9'
)。\D
匹配任何非数字字符。
这将成功匹配任何稍微不太模糊的内容:
"6 of 99 fans in the whole galaxy of fans"
匹配组将是 99
。
"6 of 99 crazed fans"
匹配组将是 99
。
"6 of 99 41 fans"
它将无法匹配,因为里面有第二个数字。
要了解更多关于 Python 正则表达式的内容,您可以阅读 各种 网页 页面。为了快速提醒,在 Python 解释器中执行:
>>> import re
>>> help(re)
当你从网页中"scraping"文本时,有时可能会遇到HTML代码的问题。一般来说,正则表达式不是忽略HTML或XML标记的好工具(参见
此处);最好使用
Beautiful Soup解析HTML并提取文本,然后使用正则表达式获取您真正想要的文本。
我希望这很有趣和/或教育性。
.*?
在这种情况下很有帮助。 - Roger Pate