python - 我如何编写 Python Regex 将采用 4 个数字后跟拼音字母值?示例 : 1 2 3 4 Alpha Bravo -> 1234AB

标签 python regex speech-to-text rasa

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

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

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

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

但是,我现在正在尝试实现一个语音转文本功能(Azure 认知服务),该功能不太容易识别字母表。例如,“B”被选为“蜜蜂”。

我现在正在尝试更改正则表达式,以便用户可以说“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'。

我真的很感激任何关于如何解决这个问题的解决方案。如果这在 Regex 中不容易实现,我相信在链接的媒体文章中更改以下函数将获得我想要的结果。不幸的是,我不是 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

我希望这已经足够清楚了。

谢谢!

jack

最佳答案

您可以使用 3 组匹配数字之间和大写字符 A-Z 之间的可选空格。

([1-9](?:\s*[0-9]){3})\s?([A-Z])[a-z]*\s*([A-Z])[a-z]*

模式匹配

  • ([1-9](?:\s*[0-9]){3}) 用可选的空白字符匹配 4 位数字
  • \s? 匹配一个可选的空格
  • ([A-Z])[a-z]*\s* 匹配大写字符 A-Z,后跟可选的小写字符和可选的 whitespac
  • ([A-Z])[a-z]* 匹配大写字符 A-Z 后跟可选的小写字符

regex demo

一个更严格的选项可以匹配大写字符 A-Z 后跟相同字符的大写或小写变体,使用可选的重复反向引用

\b([1-9](?:\s*[0-9]){3})\s?([A-Z])(?i:\2*)\s*([A-Z])(?i:\3*)\b

Regex demo | Python demo

import re

pattern = r"\b([1-9](?:\s*[0-9]){3})\s?([A-Z])(?i:\2*)\s*([A-Z])(?i:\3*)\b"
strings = [
    "1 2 3 4 Alpha Bravo",
    "1234 Alpha Bravo",
    "1234A Bbbbbbbc",
    "1234Aaa Bbb",
    "1234Aa Bbb",
    "1234A BbbbbBbb"
]

for s in strings:
    print(re.findall(pattern, s))

输出

[]
[]
[]
[('1234', 'A', 'B')]
[('1234', 'A', 'B')]
[('1234', 'A', 'B')]

关于python - 我如何编写 Python Regex 将采用 4 个数字后跟拼音字母值?示例 : 1 2 3 4 Alpha Bravo -> 1234AB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66226664/

相关文章:

java - Watson STT Java - 无法解析 MediaType AUDIO_WEBM

c# - 使用 System.Speech 将 mp3 文件转换为文本

python - 导入数据显示0000-00-00格式

python - 覆盖具有参数的 FastAPI 依赖项

python - 如何在 python 中创建 2-way 表?

java - java中的字符串模式与正则表达式匹配

regex - 从字符串中提取第一个数字

Python Pandas 聚合文本字段中的空格分隔值

java - 在 JPA CriteriaBuilder 中使用正则表达式

node.js - 如何修复 "Here is no default audio device configured"语音转文本