【问题标题】:Python regex AttributeError: 'NoneType' object has no attribute 'group'Python regex AttributeError:“NoneType”对象没有属性“组”
【发布时间】:2015-09-06 22:41:43
【问题描述】:

我使用正则表达式从带有selenium.webDriver 的网页上的搜索框中检索某些内容。

searchbox = driver.find_element_by_class_name("searchbox")
searchbox_result = re.match(r"^.*(?=(\())", searchbox).group()

只要搜索框返回与正则表达式匹配的结果,代码就可以工作。但是如果搜索框回复字符串"No results" 我会得到错误:

AttributeError: 'NoneType' 对象没有属性 'group'

如何让脚本处理"No results" 的情况?

【问题讨论】:

    标签: python regex attributeerror


    【解决方案1】:

    我设法找出了这个解决方案:在搜索框回复为 "No results" 并因此与正则表达式不匹配的情况下省略 group()

    try:
        searchbox_result = re.match("^.*(?=(\())", searchbox).group()
    except AttributeError:
        searchbox_result = re.match("^.*(?=(\())", searchbox)
    

    【讨论】:

    • 如果我有多个正则表达式并且不想单独排除它们,有什么解决方案吗?
    • 在您的代码中)searchbox 之后丢失group() 之后
    【解决方案2】:

    当你这样做时

    re.match("^.*(?=(\())", search_result.text)
    

    如果没有找到匹配,None 将被返回:

    如果字符串与模式不匹配,则返回None;请注意,这与零长度匹配不同。

    您应该在应用group 之前检查您是否获得了结果:

    res = re.match("^.*(?=(\())", search_result.text)
    if res:
        # ...
    

    【讨论】:

    • 谢谢,你能给出更具体的代码示例吗?如果它什么也没找到,我基本上希望它写""res。或者,如果使用except,则为pass
    • @Winterflags 可以查看res is None,如果是则改成""
    • @Winterflags 另请注意,您的正则表达式是贪婪的,它匹配以下字符串中的“abc(def”abc(def(。这是您想要的吗?
    • 我用if conditiontraceback 更新了这个问题。即使我在正则表达式之后做了if,它似乎也引用了re.match 的行。
    • 正则表达式现在按预期工作,可能过于贪婪,但不会产生捕获错误。如果有必要将其更改为考虑None,我们可以这样做。
    【解决方案3】:

    由于您的正则表达式与您的目标值不匹配而发生此错误。确保您是使用正确形式的正则表达式还是使用 try-catch 块来防止该错误。

    try:
        pattern = r"^.*(?=(\())"
        searchbox_result = re.match(pattern, searchbox).group()
    except AttributeError:
        print("can't make a group")
    

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-28
      • 2017-10-05
      • 2018-03-17
      • 2019-01-10
      • 2013-08-06
      • 1970-01-01
      相关资源
      最近更新 更多