用同一字符串中的单个单词替换字符串的一部分

Posted

技术标签:

【中文标题】用同一字符串中的单个单词替换字符串的一部分【英文标题】:Replace part of a string with single word from the same string 【发布时间】:2014-01-04 17:48:06 【问题描述】:

这是我的代码的输出:

Tue Dec 17 04:34:03 +0000 2013,Email me for tickets email me at stormyjackson28@Gmail.com,1708824644
Tue Dec 17 04:33:58 +0000 2013,@musclepotential ok man. you can email sbrown9049@gmail.com,25016561

我想在,<text>,(逗号之间的文本)中找到电子邮件地址,然后仅重新打印该电子邮件。

例子:

Tue Dec 17 04:34:03 +0000 2013, stormyjackson28@Gmail.com,1708824644
Tue Dec 17 04:33:58 +0000 2013, brown9049@gmail.com,25016561

我知道我可以使用下面的正则表达式来获取电子邮件,但随后我丢失了其他数据。

string = str(messages)
regex = "\w+@\w+\.com"
match = re.findall(regex,string)

【问题讨论】:

输入是什么样的? 我很确定\w+ 不够好。 joe.smith@gmail.com呢? 【参考方案1】:

根据您的示例 使用这个模式,.*?(\S+),Demo 该解决方案独立于电子邮件模式,因为它是最受欢迎的模式之一 它可能会有很大的不同,例如 first.last@us.gov

【讨论】:

请注意,这仅适用于电子邮件地址在逗号之间的情况,并且它会捕获逗号之间的任何最后一个单词。【参考方案2】:

在你当前的代码之后,试试这个:

new_string = string.split(',')
new_string[1] = match[0]
output_string = ', '.join(new_string)

【讨论】:

【参考方案3】:

这可能会很好......

string = str(messages)
regex = "(?<=,).*?(?=\S+,\d+$)"
ouput_str=re.sub(regex,"",string)

【讨论】:

【参考方案4】:

以上答案取决于您的文本与您的示例非常相似。这段代码更加灵活,可以匹配文本中任意数量的电子邮件。我没有详细记录它,但是...

harvest_emails 接受一串行分隔的字符串,每个字符串都以逗号分隔,如您的示例中date,message_string,identifier,并返回一个生成器,该生成器生成一个 3 长度元组 (date,comma-sep-emails,identifier) .它将从文本中提取任意数量的电子邮件,并匹配任何形式为 x@x.com | x@x.net | x@x.org 的电子邮件,其中 x 是任何非零长度的非空白字符系列。

def harvest_emails(target):
    """"Takes string, splits it on \n, then yields each line formatted as:
datecode, email, identifier
"""
    import re

    for line in target.splitlines():
        t = line.split(",")
        yield (
            t[0].strip(),
            ','.join(
                re.findall("\S+@\S+\.(?:com|org|net)",
                           ''.join(t[1:-1]).strip(),re.I)[0:]),
            t[-1].strip())

.

>>>messages = """04:34:03 +0000 2013,Email me for tickets email me at stormyjackson28@Gmail.com,1708824644
Tue Dec 17 04:33:58 +0000 2013,@musclepotential ok, man. you can email sbrown9049@gmail.com,25016561
Tue Dec 17 04:34:03 +0000 2013, stormyjackson28@Gmail.Com, name@domain.com,1708824644
Tue Dec 17 04:33:58 +0000 2013, brown9049@gmail.com,25016561"""
>>>data = list()
>>>for line in harvest_emails(messages):
        d = dict()
        d["date"],d["emails"],d["id"] = line[0],line[1].split(','),line[2]
        data.append(d)
>>>for value in data:
        print(value)
'emails': ['stormyjackson28@Gmail.com'], 'date': '04:34:03 +0000 2013', 'id': '1708824644'
'emails': ['sbrown9049@gmail.com'], 'date': 'Tue Dec 17 04:33:58 +0000 2013', 'id': '25016561'
'emails': ['stormyjackson28@Gmail.Com', 'name@domain.com'], 'date': 'Tue Dec 17 04:34:03 +0000 2013', 'id': '1708824644'
'emails': ['brown9049@gmail.com'], 'date': 'Tue Dec 17 04:33:58 +0000 2013', 'id': '25016561'

【讨论】:

以上是关于用同一字符串中的单个单词替换字符串的一部分的主要内容,如果未能解决你的问题,请参考以下文章

电脑系统批处理,如何将多个tab替换为一个tab,而单个的tab不变化?

用整数替换字符串中的重复单词

用多个字典值替换字符串中的单词?

用单个空格替换字符串中的多间距 - Python [重复]

MS Access查询:使用单个字符替换字符串中的所有字符

如果它包含列表中的单词,则替换 Pandas 系列中部分字符串的最快方法