python - 如何编写 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
我希望这足够清楚。
谢谢!
杰克
解决方案
也许你可以尝试这样的正则表达式:
(?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+ 次出现的字母
推荐阅读
- python - XGBClassifier ValueError: 操作数不能与形状一起广播 (2557,) (8,) (2557,)
- authentication - 单点登录。如何使用 IdP 作为代理?
- python - 从pycharm中的输入框中获取文本
- in-app-update - Google play in APP update api 不适用于 android 10 (sdk 29) 或更高版本
- c - cs50 拼字游戏:无论输入什么,总是打印相同的答案
- kotlin - 在 Firestore addSnapshotListener 返回时 ViewBinding 上的 NullPointerException
- typescript - TypeScript 从对象接口推断特定的属性类型
- javascript - 悬停后创建不透明的超链接,同时为 div 父级设置透明背景
- c# - 使用 Blazor 的 Web 浏览器 ftp 请求(LIST、MDTM、DownLoad 等)是否可用?
- bash - Kubernetes HTTP 流量转到正在更新的 pod