【问题标题】:Python regular expression (is it possible to shorten it?)Python正则表达式(可以缩短吗?)
【发布时间】:2013-12-23 07:28:07
【问题描述】:

我正在尝试解析表单中包含数千行文本的输入文件

[month/day/year hh:mm:ss AM/PM] FirstName1 LastName1: text.... 

[month/day/year hh:mm:ss AM/PM] FirstName2 LastName2: text....

我需要删除括号中的文本FirstNameLastName,只留下text 部分。我用蛮力的方式做到了,但我相信还有一种更优雅的方式:

with open('inputfile.txt') as fin, open('file-out.txt','w') as fout:
    for line in fin:
        fout.write(re.sub('(\[[^)]*\])+(\sFirstName1 LastName1|\sFirstName2 LastName2)', '',line))

有没有办法缩短这个正则表达式(例如只使用名字的前 2 个字母和姓氏的最后 2 个字母或其他什么?)。我没有经常使用正则表达式,所以任何建议都将不胜感激。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    作为正则表达式的替代方法,您可以在第一次出现: + 空格时拆分字符串。

    text = line.split(": ", 1)[1]
    

    【讨论】:

    • +1 或同理:re.sub(r'.+: ', '', line)。真正的问题是 OP 的数据是否比我们展示的更复杂。如果是这样,这些简单的方法可能太粗糙了。
    • 谢谢。但如果这就是所有操作需求,这就足够了:)
    • re.sub(r'.+: ', '', line) 返回一个空文件。我正在尝试处理聊天日志并稍后使用 nltk 分析文本,但我想删除聊天参与者的日期、时间和姓名。
    • @Anastasia 我的方法太简单了呢?
    • 是的,成功了!我实际上也想看到一个正则表达式解决方案,但是效果很好!谢谢!
    【解决方案2】:

    如果你可以假设名字和姓氏没有任何空格,你可以这样做

    ''.join(line.split(' ')[5:])

    【讨论】:

    • 这一个返回:之后的所有字符串,但是它们都合并在一起,这不是我需要的。我需要此文本以使用 nltk 进行进一步分析,因此我需要保留实际的单词列表。
    • 啊,你没有说你想要它在一个数组中,那么就使用line.split(' ')[5:]。与 alKid 的解决方案不同,即使您要处理的文本中有“:”,它也可以工作。
    猜你喜欢
    • 2017-08-11
    • 2020-01-09
    • 2021-08-08
    • 2012-08-28
    • 1970-01-01
    • 2015-03-21
    • 2013-06-06
    • 2015-11-28
    相关资源
    最近更新 更多