我有一堆以下(简化)格式的输入字符串:
"Hello my name is Dan"
"Hey my name is Tony"
"Hey|Hello|Hi my name is _"
我正在尝试编写一个正则表达式来从前面的示例中提取名称,但我不知道该怎么做。
我目前有
import re
r = re.search("(Hello|Hey|Hi) my name is .+")
我如何真正获得捕获的名称?
你其实离得并不远。您缺少正则表达式提供的文本,但我猜您实际上想编译一个以供以后使用
import re
r = re.compile("(Hello|Hey|Hi) my name is (.+)")
... 之后
match = r.search(text)
if match:
name = match.groups()[1]
这里发生的事情是所有被括号包围的东西都被视为一个捕获的组。如果有匹配,您可以稍后参考。您还可以使用命名匹配项(?P<name>PATTERN)
试试这个:
import re
r = re.search("(?:Hello|Hey|Hi) my name is (\w+)", "Hello my name is Tony")
print r.groups()[0]
打印Tony
。
您可以使用(\w+)
匹配分组。
但是如果“我的名字是”应该在你的字符串中,为什么不使用类似的东西
r.split('my name is ', 1)[1].split(' ', 1)[0]
使用组来检索您的正则表达式匹配部分。这是您的小码的改进变体:
import re
str = "Hello my name is Dan"
r = re.search("(Hello|Hey|Hi) my name is (.+)", str)
name = r.group(2)
我在 (.+) 周围添加了括号,以便搜索对象可以引用它们。group(0) 是完整匹配的字符串。group(1) 是第一组 - Hello、Hey 或 Hi。group(2) 是名称。