首页 > 解决方案 > 如何编写 Python 正则表达式,它将采用 4 个数字,后跟音标值?示例:1 2 3 4 Alpha Bravo -> 1234AB

问题描述

我正在使用以下脚本,以便 Rasa 框架在用户传递荷兰邮政编码时检测到它:

https://medium.com/@naoko.reeves/rasa-regex-entity-extraction-317f047b28b6

荷兰邮政编码的格式是 1234 AB。这在使用正则表达式时效果很好,例如:

 [1-9][0-9]{3}[\s]?[a-z]{2}

但是,我现在正在尝试实现一个语音转文本功能(Azure 认知服务),它不能很容易地使用字母表。例如,“B”被选为“Bee”。

我现在正在尝试更改正则表达式,以便用户可以说“1 2 3 4 Alpha Bravo”并且正则表达式提取器将挑选出“1 2 3 4 A B”。

我尝试过使用如下的单词边界:

[1-9]*[\s]?[0-9]*[\s]?[0-9]*[\s]?[0-9]*[\s]?\b[a-zA-Z]

[1-9]\s[0-9\s]{5}\s?\b[a-zA-Z]

前者过​​于宽松,如果用户说“你好”,它将触发正则表达式提取器并将“HT”传递给邮政编码行为。

后者更严格,但我只能让 '1 2 3 4 Alpha Bravo' 匹配为 '1 2 3 4 A'。

我真的很感激任何关于如何解决这个问题的解决方案。如果这在正则表达式中不容易实现,我相信在链接的中篇文章中更改以下函数会得到我想要的结果。不幸的是,我不是 Python/Regex 专家 :)。

 def match_regex(self, message):
    extracted = []
    for d in self.regex_feature:
        match = re.search(pattern=d['pattern'], string=message)
        if match:
            entity = {
                "start": match.pos,
                "end": match.endpos,
                "value": match.group(),
                "confidence": 1.0,
                "entity": d['name'],
            }
            extracted.append(entity)
    extracted = self.add_extractor_name(extracted)
    return extracted

我希望这足够清楚。

谢谢!

杰克

标签: pythonregexspeech-to-textrasa

解决方案


也许你可以尝试这样的正则表达式:

(?i)\b([1-9][0-9]{3} ?[a-z])[a-z]* +([a-z])[a-z]*

无论此正则表达式匹配什么,只需将其替换为\1\2即 Group1 的内容,然后是 Group 2 的内容。

点击演示

点击获取代码

解释:

  • (?i)- 切换以使匹配不区分大小写
  • \b- 单词边界
  • ([1-9][0-9]{3} ?[a-z])-下面描述 的第 1 组的内容
    • [1-9]- 匹配从 1 到 9 的任何数字
    • [0-9]{3}- 匹配从 0 到 9 的任何数字的 3 次出现
    • ?- 匹配 0 或 1 次出现的空格
    • [a-z]- 匹配单个出现的字母。这将是数字后第一个单词的第一个字母
  • [a-z]*- 匹配 0+ 次出现的字母
  • +- 匹配 1+ 个空格
  • ([a-z])- 匹配一个字母并将其存储在第 2 组中。这将是第二个单词的第一个字母
  • [a-z]*- 匹配 0+ 次出现的字母

推荐阅读