Python新手在这里,使用3.5。我觉得这个问题与其他问题相似,但是尽管已经阅读了这些并试图遵循给出的建议,但我仍然没有得到这个正则表达式的任何地方。
我有一个文本字符串,其中我想用空格替换所有换行符,这些换行符后面没有其他换行符或三个空格。我试图使用带有负前瞻的正则表达式来做到这一点。我已经知道我需要使用来自this conversation的多行。尽管如此,我的正则表达式并没有识别我的字符串中的任何内容。基本上,我想匹配并替换下面字符串中间的\ r \ n,同时保持字符串开头和结尾处的那些不变。
body = 'foo foo\r\n\xa0\xa0\xa0foo foo foo\r\n\foo foo foo foo foo\r\n\r\n\foo foo foo'
breakRegex = re.compile(r'(\r\n)?!(\r\n)|(\r\n)?!(\s\s\s)', s,re.M)
breakRegex.sub(' ', body)
期望的和迄今为止未得到的结果将是:
'foo foo\r\n\xa0\xa0\xa0foo foo foo foo foo foo foo foo\r\n\r\n\foo foo foo'
我也尝试了上面没有那么多括号,用\ s代替\ xa0等等,但它仍然不起作用...感谢您提供的任何帮助。
答案 0 :(得分:0)
这是你想要的吗?
break_regex = re.compile(r'\r\n(?!=\r\n|\s\s\s)', re.M)
所有换行
\r\n
, 其后没有(?!=...)
, 要么(|
), 另一个换行符\r\n
, 或三个空格\s\s\s
。
修改强>
抱歉,我犯了一个错误,你应该尽快删除正则表达式中的=
。 :)
您的意思是?:
body ='foo foo \ r \ n \ xa0 \ xa0 \ xa0foo foo foo \ r \ nfoo foo foo foo foo \ r \ n \ r \ n \ nfoo foo foo'
而不是:
body ='foo foo \ r \ n \ xa0 \ xa0 \ xa0foo foo foo \ r \ n \ foo foo foo foo foo \ r \ n \ r \ n \ foo foo foo'`
因为\f
表示Formfeed(0x0c
)。
答案 1 :(得分:0)
def clean_with_puncutation(text):
from string import punctuation
import re
punctuation_token={p:'<PUNC_'+p+'>' for p in punctuation}
punctuation_token['<br/>']="<TOKEN_BL>"
punctuation_token['\n']="<TOKEN_NL>"
punctuation_token['<EOF>']='<TOKEN_EOF>'
punctuation_token['<SOF>']='<TOKEN_SOF>'
#punctuation_token
regex = r"(<br/>)|(<EOF>)|(<SOF>)|[\n\!\@\#\$\%\^\&\*\(\)\[\]\
{\}\;\:\,\.\/\?\|\`\_\\+\\\=\~\-\<\>]"
###Always put new sequence token at front to avoid overlapping results
#text = '<EOF>!@#$%^&*()[]{};:,./<>?\|`~-= _+\<br/>\n <SOF>\ '
text_=""
matches = re.finditer(regex, text)
index=0
for match in matches:
#print(match.group())
#print(punctuation_token[match.group()])
#print ("Match at index: %s, %s" % (match.start(), match.end()))
text_=text_+ text[index:match.start()] +" "
+punctuation_token[match.group()]+ " "
index=match.end()
return text_