Python 正则表达式替换空格

2 投票
1 回答
818 浏览
提问于 2025-04-16 13:33

代码:

word = 'aiuhsdjfööäö ; sdfdfd'
word1=re.sub('[^^äÄöÖåÅA-Za-z0-9\t\r\n\f()!{$}.+?|]',"""\[^^0-9\t\r\n\f(!){$}.+?|\]*""", word) ; print 'word=  ', word
word2=re.sub('[^^äÄöÖåÅA-Za-z0-9\t\r\n\f()!{$}.+?|]',"""\[^^0-9\\t\\r\\n\\f(!){$}.+?|\]*""", word) ; print 'word=  ', word
word3=re.sub('[^^äÄöÖåÅA-Za-z0-9\t\r\n\f()!{$}.+?|]',"""\[^^0-9\\\t\\\r\\\n\\\f(!){$}.+?|\]*""", word) ; print 'word=  ', word
word4=re.sub('[^^äÄöÖåÅA-Za-z0-9\s()!{$}.+?|]',"""\[^^0-9\s(!){$}.+?|\]*""", word) ; print 'word=  ', word
word5=re.sub('[^^äÄöÖåÅA-Za-z0-9\s()!{$}.+?|]',"""\[^^0-9\\s(!){$}.+?|\]*""", word) ; print 'word=  ', word
word6=re.sub('[^^äÄöÖåÅA-Za-z0-9\s()!{$}.+?|]',"""\[^^0-9\\\s(!){$}.+?|\]*""", word) ; print 'word=  ', word

F=open('suoriP.txt','w')
F.writelines(word1+'\n\n'+word2+'\n\n'+word3+'\n\n'+word4+'\n\n'+word5+'\n\n'+word6)
F.close

结果:

aiuhsdjfööäö\[^^0-9 

(!){$}.+?|\]*\[^^0-9    

(!){$}.+?|\]*\[^^0-9    

(!){$}.+?|\]*sdfdfd

aiuhsdjfööäö\[^^0-9 

(!){$}.+?|\]*\[^^0-9    

(!){$}.+?|\]*\[^^0-9    

(!){$}.+?|\]*sdfdfd

aiuhsdjfööäö\[^^0-9\    \
\
\(!){$}.+?|\]*\[^^0-9\  \
\
\(!){$}.+?|\]*\[^^0-9\  \
\
\(!){$}.+?|\]*sdfdfd

aiuhsdjfööäö \[^^0-9\s(!){$}.+?|\]* sdfdfd

aiuhsdjfööäö \[^^0-9\s(!){$}.+?|\]* sdfdfd

aiuhsdjfööäö \[^^0-9\s(!){$}.+?|\]* sdfdfd

问题:

我不明白为什么:

  1. 在正则表达式中,反斜杠(\)没有被替换,像 \s、\s、\\s 都被当作 \s 处理。

  2. 正则表达式没有把 \\t\\r\\n\\f 替换成 ';'。

我正在尝试通过分析一个文件来生成复杂的正则表达式模式,并且这些模式中包含变量名。

我无法生成空格字符的表示形式 [^^äÄöÖåÅA-Za-z0-9\t\r\n\f()!{$}.+?|]。我的意思是,如果我在文本文件中找到 ';',我用 word1=re.sub('[^^äÄöÖåÅA-Za-z0-9\t\r\n\f()!{$}.+?|]',.... 来处理。

我无法用字符串 '[^^äÄöÖåÅA-Za-z0-9\t\r\n\f()!{$}.+?|]' 来替换这个字符 ';'。

这个字符串是一个模式字符串,我在 re.search 中使用它来提取某些单词作为变量。

解决方案< 后来出现并添加的。

最后,我用 xxxx 替代了空格特殊字符。之后通过添加 '\t\n\f\v\r' 来合并、拆分和再次合并字符串。

strsub=smart_str('[^^äÄöÖåÅA-Za-z0-9xxxx()!{$}.+?|`\"£$\%&_+~#\'@><]+', encoding='utf-8', strings_only=False, errors='replace' )
word=re.sub('[^^äÄöÖåÅA-Za-z0-9\t\n\r\f()!{$}.+?|£$\%&_+~#\'@><]+',strsub,word)

for line in word.split('xxxx'):
     str2=str2+'\\t\\n\\f\\v\\r'+line 
     F.writelines(str2)

1 个回答

0

当你使用 re.sub 时,第二部分不需要是正则表达式——你只需要把它分组,然后用 \1\2 来调用,比如这样:

 word="aiuhsdjfööäö"
 word1=re.sub("(.+?)[äa](.+?)","\1a\2 [corrected]",word)

我上面做的完全没有必要,但我这样做是为了说明一个观点:在使用 re.sub 的第二部分时,[ 不一定要放在 \ 后面。

撰写回答