【问题标题】:Python/Regex Partial String ReplacementPython/Regex 部分字符串替换
【发布时间】:2015-04-17 12:50:03
【问题描述】:

编辑以阐明我尝试了什么以及我的目标是什么。

我的目标是获取一个列表,并且对于列表中的每个元素,用“X”替换紧跟在管道后面的任何字符(如果存在这样的字符)。

例如:

[A|1,B|C,D|9] 将变为 [A|X,B|X,D|X]

从网上看,我认为这将是某种正则表达式,但我不确定如何具体获取以下一个字符。

我试过了

re.sub('|*?', "X", listname)

但在开始之前会出现“悬空元字符”错误。我想说:“取一个 | 后面的任何单个字符并将该字符更改为 X。

我也试过了:

re.sub('\|(.)', "X", listname)

但是得到TypeError: expected string or buffer

关于我正在寻找澄清 cmets 的更多上下文...

在我的具体代码中后面总会跟着一些东西。我只关心那个“东西”的第一个字符。所以 [A|124,B|s] 需要产生 [A|X24,B|X]

【问题讨论】:

  • 你需要展示你到目前为止所做的尝试!如果您想得到想要的答案,请说出您的问题!因为 SO 不是 为我做的 网站!
  • 你想替换后面的字符还是后面的单词,即A|12变成A|X2还是A|X
  • @hwnd 我不想匹配任何东西。也就是说,对于我的特定代码,我从未遇到过这种情况。

标签: python regex python-2.7


【解决方案1】:

我想说:“取| 后面的任何单个字符并将该字符更改为X

您可以使用列表推导和以下正则表达式来做到这一点。

>>> import re
>>> lst = ['A|1', 'B|C', 'D|9', 'E|124', 'F|s']
>>> [re.sub(r'(?<=\|).', 'X', x) for x in lst]
['A|X', 'B|X', 'D|X', 'E|X24', 'F|X']

(?&lt;= ... ) 是一个零宽度断言,它不会“消耗”字符串中的任何字符,而只会断言紧接在字符串中当前位置之前的是|

【讨论】:

    【解决方案2】:

    前置匹配子句更正确,但可能更难理解。

    您可能会发现匹配 | 并再次替换它会更容易:

    import re
    
    data = ['A|1', 'B|C', 'D|9']
    data = [re.sub("\|.", "|X", d) for d in data]
    
    # data = ['A|X', 'B|X', 'D|X']
    

    【讨论】:

    • 是的,对于不懂正则表达式的人来说更容易理解 =)
    • 是的,对于像我这样的 python 菜鸟来说非常容易掌握!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多