【问题标题】:Using regex to find email address and other values in Python String使用正则表达式在 Python 字符串中查找电子邮件地址和其他值
【发布时间】:2022-10-22 04:24:38
【问题描述】:

所以我有一个字符串,其中包含我需要为我的主程序提取的数据。
它看起来像这样:

string = "[email:first.last@gmail.com][days:90]"

从这个字符串中,我想提取括号内的数据,并能够用冒号分隔电子邮件和电子邮件地址,以便我可以分别存储单词 email 和电子邮件地址以获得如下内容:

string = "[email:first.last@gmail.com]"
... some regex here ...
param_type = "email"
param_value = "first.last@gmail.com"

if param_type == 'email':
   ... my code to send an email to param_value ...

该字符串最终最多可以有 2 对不同参数类型的括号,以便我可以指定要处理的函数:

string = "[email:first.last@gmail.com] [days:90]"
...regex to split by bracket group ....
param_type1 = "email"
param1 = "first.last@gmail.com"

param_type2 = "days"
param2 = "90"

if param_type1 != "":
   ... email code ...
if param_type2 != "":
   ... run other code for the specified number of days ...

主程序已经有这 2 个 param_types 的默认值,但我希望有一个选项来指定电子邮件地址、天数、两者或都不指定。如果有的话,我主要需要知道如何检索电子邮件地址,因为在线示例不适用于我的情况。谢谢!

【问题讨论】:

    标签: python regex string parsing


    【解决方案1】:

    你可以使用

    [([^:]*):([^]]*)]*]
    

    该正则表达式匹配任何 [attribute:value] 子字符串,其中包含属性和值部分的子表达式。

    它搜索[,然后搜索一些不是: 的字符,然后搜索:,然后搜索一些不是] 的字符,然后搜索]。 并将[: 之间的部分以及:] 之间的部分括在括号中。

    因此,如果您在此正则表达式上使用 findall,它将返回字符串中找到的所有对 [attribute:value] 的列表。

    例子:

    import re
    
    string = "[email:first.last@gmail.com] [days:90]"
    pairs=re.findall(r'[([^:]*):([^]]*)]*]', s)
    # pairs = [('email', 'first.last@gmail.com'), ('days', '90')]
    for attr,val in pairs:
        if attr=='email':
            doSomethingWithEmail(val)
        elif attr=='days':
            doSomethingWidhDays(val)
    

    【讨论】:

    • 天哪,太优雅了。在线的所有答案都有正则表达式字符串,这些字符串太长而无法理解,这对于维护程序是不合理的。你是救生员!
    【解决方案2】:

    因此,在这种情况下,您可以只使用正则表达式来提取括号之间的内容,然后拆分冒号字符以获得参数类型和参数,例如:

    [s.split(":") for s in re.findall(r"[(.+?)]", string)]
    

    所以你的代码会是这样的:

    import re
    
    string = "[email:first.last@gmail.com][days:90]"
    type_and_param_pairs = [s.split(":") for s in re.findall(r"[(.+?)]", string)]
    for param_type, param in type_and_param_pairs:
        if param_type == "email":
            # do something
        elif param_type == "days":
            # do something else
        ...
    

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 2012-02-23
      • 2011-08-03
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 2011-12-15
      相关资源
      最近更新 更多