【问题标题】:Python: many regexes in a row?Python:连续很多正则表达式?
【发布时间】:2017-07-24 17:49:28
【问题描述】:

我有一些文本文件是其他软件的输出。我有一个用胶带固定在一起的 Perl 脚本,它可以连续使用近 100 个正则表达式来清理这些脚本。

我是 Python 新手,想知道是否有比其中一大块更惯用的方法来处理这个问题,这比 perl 构造要重得多:string =~ s/blah/blah/i;

string = re.sub(r'  +', " ", string, re.I)
string = re.sub(r'(\w)- ', "\1, ", string, re.I)
string = re.sub(r'u-s', "U.S.", string, re.I)

例如某种带有正则表达式及其替换的字典?我也很好奇一个模块的函数连续调用这么多次会影响性能吗?

【问题讨论】:

  • 不需要dict,但两个tuples 中的list 是有意义的。
  • 你如何运行这么多正则表达式而不发生重叠?
  • 源文件是一个提词器脚本,因此许多提词器软件的唯一格式代码被删除,以及示例中的常见问题,即使用连字符而不是逗号来表示暂停.该文件正在转换为纯文本以供人类阅读。

标签: python regex text


【解决方案1】:

如果将正则表达式放入元组中,那么迭代元组并执行替换是一件容易的事。

正则表达式:

import re
regexs = (
    (r'  +', " ", re.I),
    (r'(\w)- ', "\1, ", re.I),
    (r'u-s', "U.S.", re.I),
)
compiled_regexs = [(re.compile(rx[0], rx[2]), rx[1]) for rx in regexs]

代码:

for line in lines:
    for regex, replace in compiled_regexs:
        line = regex.sub(replace, line)
    print(line)

测试数据:

lines = (
    'Quick  Brown  Fox',
    'u-s lazy  dog',
)

结果:

Quick Brown Fox
U.S. lazy dog 

【讨论】:

    猜你喜欢
    • 2022-09-26
    • 2015-07-03
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2017-03-12
    • 2014-04-29
    相关资源
    最近更新 更多