【问题标题】:pattern between two strings in pythonpython中两个字符串之间的模式
【发布时间】:2016-11-20 19:42:28
【问题描述】:

我有一个格式如下的字符串:

来自 Vince (aaa@bbb.com) 的产品内反馈...来自 Corey Zimmerman Anderson (ccc@ddd.com) 的产品内反馈...来自 Andrea Ibarra (eee@fff.com) 的产品内反馈)

我需要从上面的字符串中提取电子邮件 ID。 “来自“的产品内反馈将是静态的,电子邮件 ID 将始终位于括号内,但中间的名称会有所不同。

【问题讨论】:

  • 你能展示你的努力吗,另外还有很多关于 SO 的问题显示了从字符串中提取电子邮件地址的正则表达式模式
  • 那么你只是想提取括号内的文字吗?

标签: python regex


【解决方案1】:

由于您拥有的文本几乎是静态的,并且名称可能不包含(),您可以使用非正则表达式方法:

s = "In-product feedback from Vince (aaa@bbb.com)"
s_clean = s.rsplit('(')[1].strip(')')
print(s_clean)
# 'aaa@bbb.com'

还是使用正则表达式:

import re

s = "In-product feedback from Vince (aaa@bbb.com)"
s_clean = re.findall(r'\((.*?)\)', s)[0]
print(s_clean)
# 'aaa@bbb.com'

如果出现多次,您将获得所有电子邮件的列表:

s = "In-product feedback from Vince (aaa@bbb.com)...In-product feedback from Corey Zimmerman Anderson (ccc@ddd.com)...In-product feedback from Andrea Ibarra (eee@fff.com)"
s_clean = re.findall(r'\((.*?)\)', s)
print(s_clean)
# ['aaa@bbb.com', 'ccc@ddd.com', 'eee@fff.com']

【讨论】:

  • 是的,如果您删除[0],您将获得所有带有s_clean = re.findall(r'\((.*?)\)', s) 的列表。查看我的更新
【解决方案2】:

使用以下代码:

import re
r = re.findall(r"\(([^)]+)\)", s)
print(r)

字符串中的 s 位置。

【讨论】:

  • 嗨 UpmostScarab:我的字符串中多次出现该模式。您的代码仅返回最后一次出现。我如何修改它以返回所有出现的事件?
  • 谢谢...它做到了:)
【解决方案3】:

试试这个

import re
str = 'In-product feedback from Vince (aaa@bbb.com)'
regex = '(In-product feedback from) ([a-zA-Z ]+) \(([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)\)'
phrase= re.match(regex, str)
print phrase.group(1) # In-product feedback from
print phrase.group(2) # Vince 
print phrase.group(3) # aaa@bbb.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2018-11-23
    • 1970-01-01
    • 2013-07-28
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多