用字符串中的字符串替换字符串中的字符串

时间:2017-12-06 14:08:22

标签: python regex string replace

我们说我有一个这样的字符串:

s = '(X_xy09 and X_foobar or (X_abc123 and X_something))'

我想把它变成

'(xy09 and foobar or (abc123 and something))'

然后 - 在这种特殊情况下 - 我可以简单地做

s.replace('X_', "")

给出了所需的输出。

但是,在我的实际数据中,可能不仅有X_而且还有其他前缀,因此上述replace语句不起作用。

我需要的是替换

大写字母后跟下划线和任意字母和数字序列

通过

第一个下划线后的所有内容。

因此,要提取我可以使用的所需元素:

import re
print(re.findall('[A-Z]{1}_[a-zA-Z0-9]+', s))

打印

['X_xy09', 'X_foobar', 'X_abc123', 'X_something']

我现在如何替换这些元素以便获得

'(xy09 and foobar or (abc123 and something))'

4 个答案:

答案 0 :(得分:3)

如果您只需要替换大写字母后跟下划线,则可以使用正则表达式r'[A-Z]_'

s = '(X_xy09 and X_foobar or (X_abc123 and X_something))'
re.sub(r'[A-Z]_', '', s)

如果您没有提及其他标准,则可能需要添加。 (例如,某些目标值遵循单词边界,而某些目标值遵循括号。)如果您输入XY_something,则上述可能会给出错误的输出。这取决于您对输出的期望。

答案 1 :(得分:3)

如果你需要删除一个带有下划线的大写ASCII字母,只有当前面没有单词char并且后面跟着一个字母数字字符时,你可以使用

import re
s = '(X_xy09 and X_foobar or (X_abc123 and X_something))'
print(re.sub(r'\b[A-Z]_([a-zA-Z0-9])', r'\1', s))

请参阅Python demoregex demo

模式详情

  • \b - 领先的单词边界
  • [A-Z]_ - ASCII大写字母和_
  • ([a-zA-Z0-9]) - 第1组(后来用替换模式中的\1引用):1个字母数字字符。

答案 2 :(得分:2)

另一种re.sub()方法:

import re

s = '(X_xy09 and X_foobar or (X_abc123 and X_something))'
result = re.sub(r'[A-Z]_(?=[a-zA-Z0-9]+)', '', s)

print(result)

输出:

(xy09 and foobar or (abc123 and something))
  • [A-Z]_(?=[a-zA-Z0-9]+) - (?=...) 肯定的先行断言,确保替换的[A-Z]_子字符串后面跟着字母数字序列[a-zA-Z0-9]+

答案 3 :(得分:2)

您可以将re.sub()与先行断言一起使用:

>>> import re
>>> s = '(X_xy09 and X_foobar or (X_abc123 and X_something))'
>>> re.sub(r'\b[A-Z]_(?=[a-zA-Z0-9])', '', s)
'(xy09 and foobar or (abc123 and something))'

来自docs

  

(?=...)
      匹配如果...匹配下一个,但不消耗任何字符串。这称为 lookahead断言。例如,Isaac (?=Asimov)只有在'Isaac '之后才匹配'Asimov'