我们说我有一个这样的字符串:
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))'
答案 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))
模式详情
\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)