【问题标题】:regex/python to find and replace specific number within string正则表达式/python 在字符串中查找和替换特定数字
【发布时间】:2013-02-26 18:07:24
【问题描述】:

我需要替换出现在较长字符串中的数字(角),看起来都与此类似:

[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ]

我的函数将“旧”数字替换为“新”数字,例如如果旧数字是 17 而新数字是 19,那么结果应该是:

[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ]

请注意,只有 \ 中的数字应该被替换(这些也可以是 // )。

为此,我尝试设置一个正则表达式替换,目的是避免 \ \ 或 / / 之外的数字: newplane = re.compile(r"[^[_] (" + str(oldcorner) + ")").sub(str(newcorner), oldplane)

我很快意识到这不起作用,因为正则表达式从行首开始搜索,如果与模式不匹配则失败。

一定有一些我不知道的聪明方法。有什么建议吗?

【问题讨论】:

  • 它们会在 '\\' 之间还是单个 '\' 之间?我的第一直觉是将其拆分为'\'(或双倍),在结果的每个第二个元素上调用普通的旧替换(旧,新),然后在'\'处将它们重新连接在一起。不过不是很pythonic,有兴趣看看有人有没有巧妙的方法
  • 它们都在单个“\”或单个“/”内。这不是一个坏主意!也会删除正则表达式....
  • 是的,这会让事情变得简单,但不确定如何在同一行中同时处理 '\' 和 '/'

标签: python regex parsing python-2.7


【解决方案1】:

除了 vpekar 答案之外,您还可以在替换字符串上使用模式的反向引用,因此您可以尝试匹配 /\ 之间的所有内容,并使用新编号和反向引用重新创建字符串:

line = '[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ]'
re.sub(r'([\\|/].*\s)(?:17)(\s.*[\\|/])', r'\g<1>19\2', line)

返回:

'[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ]'

【讨论】:

  • 感谢 asermax!我也很喜欢这种单线解决方案!我的正则表达式知识显然存在一些差距。谢谢!
  • 你能解释一下它的一部分吗? sub 有 3 个参数:旧的、新的、字符串。你可以留下第一个r。反向引用 1 号在哪里? 2 号是 \2。
  • 不需要非捕获组,更简单:re.sub(r'([\\|/].*\s)(17)(\s.*[\\|/])', r'\g&lt;1&gt;19\3', line)
【解决方案2】:

您可以在正则表达式的子部分中使用回调函数:

import re

def callback(match):
    return match.group(0).replace('17', '19')

s = "[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ]"

s = re.compile(r'\\.+?\\').sub(callback, s)

print s

打印:

[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ]

【讨论】:

  • 斜线去哪儿了?
  • 谢谢你,vpekar!回调函数真的很聪明!
  • 这个问题有一个问题:如果有一个三位数(或更多)的数字,其中包含“17”,回调也将替换它。
  • 回调的意思是先回调运行再sub? callback 获取参数 s?
  • 问号(非贪婪运算符)是否有意义,因为在贪婪和非贪婪之间没有决定?
猜你喜欢
  • 2014-10-20
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
相关资源
最近更新 更多