Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字符串清理:如何删除Python中字符串多余的换行符?_Python_Django_String - Fatal编程技术网

Python字符串清理:如何删除Python中字符串多余的换行符?

Python字符串清理:如何删除Python中字符串多余的换行符?,python,django,string,Python,Django,String,我正在创建一个Python/Django应用程序,我需要清理一个字符串,但我遇到的主要问题是字符串的某些部分有太多换行符。我不想删除所有的换行符,只想删除多余的换行符。如何在python中归档?我以Python 2.7和Django 1.6为例,如果您知道要替换什么: >>> a = 'string with \n a \n\n few too many\n\n\n lines' >>> a.replace('\n'*2, '\n') # Replaces \

我正在创建一个Python/Django应用程序,我需要清理一个字符串,但我遇到的主要问题是字符串的某些部分有太多换行符。我不想删除所有的换行符,只想删除多余的换行符。如何在python中归档?我以Python 2.7和Django 1.6为例,如果您知道要替换什么:

>>> a = 'string with \n a \n\n few too many\n\n\n lines'
>>> a.replace('\n'*2, '\n') # Replaces \n\n with just \n
'string with \n a \n few too many\n\n lines'
>>> a.replace('\n'*3, '') # Replaces \n\n\n with nothing...
'string with \n a \n\n few too many lines'
或者,使用正则表达式查找所需内容

>>> import re
>>> re.findall(r'.*([\n]+).*', a)
['\n', '\n\n', '\n\n\n']

regexp是一种方法。使用更新的示例输入:

>>> a = "This is my sample text.\r\n\r\n\r\n\r\n\r\n Here start another sample text"
>>> import re
>>> re.sub(r'(\r\n){2,}','\r\n', a)
'This is my sample text.\r\n Here start another sample text'
r'(\r\n)+'
也可以,我喜欢使用2+下限来避免使用相同的子字符串替换singleton
\r\n
子字符串

或者,您可以对字符串使用该方法,并在筛选后重新加入:

>>> '\r\n'.join(line for line in a.splitlines() if line)

要使用正则表达式将多个出现的换行符替换为一个换行符(或其他您喜欢的换行符,如句点、制表符或其他),请尝试:

请注意,“\n”是单个字符(换行符),而不是两个字符(文字反斜杠和“n”)

如果您打算重复使用正则表达式,当然可以提前编译它:

pattern = re.compile('\n+')
print pattern.sub('\n', testme)

我已经尽力了,但彼得·德格洛普的更好

import re
s = '\n' * 9 + 'abc' + '\n'*10
# s == '\n\n\n\n\n\n\n\n\nabc\n\n\n\n\n\n\n\n\n\n\n'
lines = re.compile('\n+')
excess_lines = lines.findall(s)
# excess_lines == ['\n' * 9, '\n' * 10]
# I feel as though there is a better way, but this works

def cmplen(first, second):
    '''
    Function to order strings in descending order by length
    Needed so that we replace longer strings of new lines first
    '''

    if len(first) < len(second):
        return 1
    elif len(first) > len(second):
        return -1
    else:
        return 0

excess_lines.sort(cmp=cmplen)
# excess_lines == ['\n' * 10, '\n' * 9]
for lines in excess_lines:
    s = s.replace(lines, '\n')

# s = '\nabc\n'
重新导入
s='\n'*9+'abc'+'\n'*10
#s='\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
行=重新编译('\n+'))
多余的线=线。findall(s)
#多余的_行==['\n'*9'\n'*10]
#我觉得好像有更好的方法,但这是有效的
def cmplen(第一、第二):
'''
函数按长度降序排列字符串
需要这样我们才能先替换更长的新行
'''
如果len(第一个)len(第二):
返回-1
其他:
返回0
多行排序(cmp=cmplen)
#多余的_行==['\n'*10'\n'*9]
对于超过\u行的行:
s=s.replace(行“\n”)
#s='\nabc\n'

这个解决方案感觉脏而且不雅观,但它是有效的。您需要按字符串长度排序,因为如果您有一个字符串“\n\n\n aaaaaaaaa\n\n\n”并执行replace(),则\n\n\n\n将替换为\n\n\n,以后不会被捕获。

您如何决定删除哪一个换行符和不删除哪一个换行符?您是否希望创建-假设5个换行符1?示例
\n\n\n\n\n
->
\n
?我有一些带有多个'\r\n'的换行符。例如:“这是我的示例文本。\r\n\r\n\r\n\r\n\r\n在这里开始另一个示例文本”我想删除多余的\r\n,只在每一行中断时保留一个。这是一种非常复杂和低效的方式。你正在使用一个regexp来构建你的
多余的\u行
变量,为什么不像前面的大多数答案一样使用regexp替换函数呢,包括我的答案?嘿,现在,我从来没有声称喜欢我的解决方案。我不知道
\n{2,}
语法是这样工作的,你的语法在我看来更好。这听起来可能比我预想的更具敌意-我在想,既然你知道你的解决方案不是最干净的,一个更好的方法的建议可能会有用。
pattern = re.compile('\n+')
print pattern.sub('\n', testme)
import re
s = '\n' * 9 + 'abc' + '\n'*10
# s == '\n\n\n\n\n\n\n\n\nabc\n\n\n\n\n\n\n\n\n\n\n'
lines = re.compile('\n+')
excess_lines = lines.findall(s)
# excess_lines == ['\n' * 9, '\n' * 10]
# I feel as though there is a better way, but this works

def cmplen(first, second):
    '''
    Function to order strings in descending order by length
    Needed so that we replace longer strings of new lines first
    '''

    if len(first) < len(second):
        return 1
    elif len(first) > len(second):
        return -1
    else:
        return 0

excess_lines.sort(cmp=cmplen)
# excess_lines == ['\n' * 10, '\n' * 9]
for lines in excess_lines:
    s = s.replace(lines, '\n')

# s = '\nabc\n'