正则表达式应该以不同方式处理包含换行符的空格

时间:2015-06-09 18:37:26

标签: python html regex

我的目标是制作一个可以处理两种情况的正则表达式:

  • 包含任意顺序的一个或多个换行符的多个空格应该成为一个换行符
  • 排除任何换行符的多个空格应该成为空格

无序与新行的不同情况相结合,没有新行就是这种情况的复杂性。

最有效的方法是什么?

E.g。

'   \n \n \n a'     # --> '\na'
'   \t \t    a'     # --> ' a'  
'   \na\n     '     # --> '\na\n'

基准:

s = '   \n \n \n a   \t \t    a   \na\n     '
n_times = 1000000
------------------------------------------------------
change_whitespace(s)   - 5.87 s
change_whitespace_2(s) - 3.51 s
change_whitespace_3(s) - 3.93 s

n_times = 100000
------------------------------------------------------
change_whitespace(s * 100)    - 27.9 s 
change_whitespace_2(s * 100)  - 16.8 s 
change_whitespace_3(s * 100)  - 19.7 s    

2 个答案:

答案 0 :(得分:2)

(假设Python可以使用回调函数进行正则表达式替换)

您可以使用一些回调来查看替换需要的内容 第1组匹配,替换为空格 第2组匹配,替换为换行符

(?<!\s)(?:([^\S\r\n]+)|(\s+))(?!\s)

 (?<! \s )           # No whitespace behind
 (?:
      ( [^\S\r\n]+ )      # (1), Non-linebreak whitespace
   |  
      ( \s+ )             # (2), At least 1 linebreak
 )
 (?! \s )            # No whitespace ahead

答案 1 :(得分:1)

这将使用单个换行符替换包含换行符的空格,然后使用单个空格替换不包含换行符的空格。

import re

def change_whitespace(string):
    return re.sub('[ \t\f\v]+', ' ', re.sub('[\s]*[\n\r]+[\s]*', '\n', string))

结果:

>>> change_whitespace('   \n \n \n a')
'\na'
>>> change_whitespace('   \t \t    a')
' a'
>>> change_whitespace('   \na\n     ')
'\na\n'

感谢@sln提醒我正则表达式回调函数:

def change_whitespace_2(string):
    return re.sub('\s+', lambda x: '\n' if '\n' in x.group(0) else ' ', string)

结果:

>>> change_whitespace_2('   \n \n \n a')
'\na'
>>> change_whitespace_2('   \t \t    a')
' a'
>>> change_whitespace_2('   \na\n     ')
'\na\n'

这是@ sln表达式的函数:

def change_whitespace_3(string):
    return re.sub('(?<!\s)(?:([^\S\r\n]+)|(\s+))(?!\s)', lambda x: ' ' if x.group(1) else '\n', string)

结果:

>>> change_whitespace_3('   \n \n \n a')
'\na'
>>> change_whitespace_3('   \t \t    a')
' a'
>>> change_whitespace_3('   \na\n     ')
'\na\n'