【问题标题】:Unit Testing regex to check for False Positives单元测试正则表达式以检查误报
【发布时间】:2021-08-21 18:20:36
【问题描述】:

所以我有一个正则表达式,我正在与提供的单个字符串进行匹配,以检查和匹配某些信息。如果匹配,则仅返回捕获的组。我已经创建了我的函数,以便它从返回的数组中删除任何空字符串,最后,只将捕获的字符串作为输出。这在 True Positives 的单元测试中非常有用。

现在,我想使用相同的表达式检查误报,但我似乎无法弄清楚如何在单元测试中演示它。我在一个文件中有一些测试字符串,正则表达式不应该匹配,但它不匹配。所以我的代码有效。但是当我尝试在测试用例中实际展示这一点时,例如检查是否返回了空字符串,我做不到。

我本质上想检查是否找不到匹配项,那么它应该返回一个空字符串。这是我的代码

match = re.findall(combined, narration)
    result = list(filter(None, match[0]))
    if match:
        return result[0]
    else:
        result[0] = ""
        return result[0]

第一个子句适用于匹配的字符串,并返回单个字符串作为输出。在第二个子句中,我想输出一个空字符串,以便我可以检查测试用例.assertEqual 是否该字符串不匹配。但是函数返回list index out of range错误。

谁能告诉我是否有更好的方法来使用正则表达式和单元测试检查不匹配的字符串?

编辑 1: 按要求添加预期的输入和输出

输入 1 - BRN CLG-CI IQ PAID ROHIT SINGH

输出 1 - ROHIT SINGH

输入 2 - BRN-TO CASH SELF

输出 2 - '' //空字符串

【问题讨论】:

  • 当re.findall 没有找到任何东西时,它返回一个空列表。
  • 是的,我确实看到了那篇文章,并在其后添加了 else 子句。即使我为“”字符串添加括号,它也会显示相同的错误。
  • 好的,我知道你只需要一个字符串中的一个匹配项。你不需要re.findall。使用re.search:match = re.search(combined, narration) 然后if match: print(match.group(1)) else: print('No match'),见ideone.com/l0VMcN
  • 是的,我正在匹配但针对多种模式,因此我也从一个句子中提取了多个单词。所以对于我的用例,我不能使用re.search 。我可以使用re.findall 方法实现相同的技术吗?

标签: python regex unit-testing false-positive


【解决方案1】:

看来您可以使用re.findall,检查其输出,如果有匹配项,则过滤掉空匹配项并打印第一个匹配项。否则,打印一个空字符串。

见this Python demo:

import re
combined = r'^BRN.*?(?:paid|to)\s(?![A-Za-z\s]*\bself\b)([A-Za-z\s]+)'
narrations = ['BRN CLG-CI IQ PAID ROHIT SINGH','BRN-TO CASH SELF']

for narration in narrations:
    print('-------',narration,sep='\n')
    match = re.findall(combined, narration, flags=re.I)
    if match:
        result = list(filter(None, match))
        print( result[0] )
    else:
        print( '' )

屈服

-------
BRN CLG-CI IQ PAID ROHIT SINGH
ROHIT SINGH
-------
BRN-TO CASH SELF

【讨论】:

  • 好的,谢谢!这绝对解决了问题,如果我也需要在 else 情况下返回 None ,它会起作用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多