3

我有一堆以下(简化)格式的输入字符串:

"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 .+")

我如何真正获得捕获的名称?

4

4 回答 4

2

你其实离得并不远。您缺少正则表达式提供的文本,但我猜您实际上想编译一个以供以后使用

import re
r = re.compile("(Hello|Hey|Hi) my name is (.+)")

... 之后

match = r.search(text)
if match:
    name = match.groups()[1]

这里发生的事情是所有被括号包围的东西都被视为一个捕获的组。如果有匹配,您可以稍后参考。您还可以使用命名匹配项(?P<name>PATTERN)

于 2013-10-22T21:02:13.593 回答
1

试试这个:

import re
r = re.search("(?:Hello|Hey|Hi) my name is (\w+)", "Hello my name is Tony")
print r.groups()[0]

打印Tony

于 2013-10-22T21:03:28.363 回答
1

您可以使用(\w+)匹配分组。

但是如果“我的名字是”应该在你的字符串中,为什么不使用类似的东西 r.split('my name is ', 1)[1].split(' ', 1)[0]

于 2013-10-22T21:03:52.060 回答
1

使用来检索您的正则表达式匹配部分。这是您的小码的改进变体:

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) 是名称。

于 2013-10-22T21:06:18.893 回答