首页 > 解决方案 > 用于替换所有下划线的正则表达式,除非它们是主题标签的一部分

问题描述

我不知道如何编写正则表达式来替换所有下划线' '除非下划线是主题标签语句的一部分。例如,如果我们有一个文本,我们想要替换除#please_help_me这样的情况之外的所有下划线。

标签: pythonregex

解决方案


最简单的方法可能是匹配所有带有下划线的连续单词,然后传递一个函数/ lambda 来re.sub以老式方式删除下划线,前提是第一个字符不是#

sample = 'Here is_a_sample string #with_a_hashtag'
rstr = r'(#?(?:\w*_)+)'
# in this case, this matches like so:
#    'is_a_'
#    '#with_a_'
new_sample = re.sub(rstr, 
    lambda s: s.group(0) if s.group(0).startswith('#') else s.group(0).replace('_', ' '), 
    sample)
print(new_sample)
# 'Here is a sample string #with_a_hashtag'

这里涉及的正则表达式非常简单:

  • 作为匹配组 ( ()),
  • 零个或一个#符号 ( #?)
  • (?: )+其次是 ( )的不匹配组,至少重复一次
  • 任意数量的类似单词的字符,后跟下划线 ( \w*_)

推荐阅读