Python 为什么正则表达式不起作用?

Python 为什么正则表达式不起作用?,python,regex,cyrillic,Python,Regex,Cyrillic,我需要将«Саааааа1»、«Сааа2»等中出现的所有正常空格替换为非中断空格。 下面的施工很好: re.sub('(стат.{0,4}) (\d+)', r'\1 \2', text) # 'r' in repl is important, otherwise the word is not replaced correctly, at least for texts in Russian. 但是,我不想重复使用re.sub来表示«Саааа»,然后是«Пааа

我需要将«Саааааа1»、«Сааа2»等中出现的所有正常空格替换为非中断空格。 下面的施工很好:

 re.sub('(стат.{0,4}) (\d+)', r'\1 \2', text) # 'r' in repl is important, otherwise the word is not replaced correctly, at least for texts in Russian.
但是,我不想重复使用
re.sub
来表示«Саааа»,然后是«Паааа»,然后是月份名称,我希望有一个包含正则表达式和替换项的字典。这是我的代码,但它没有按预期工作:
'Саааааааааааааааааааа2'
应该类似于
'

 import re

 text = 'статья 1 статьи 2'
 dic = {'(cтат.{0,4}) (\d+)' : r'\1 \2'}


 def replace():
     global text
     final_text = ''
     for i in dic:
         new_text = re.sub(str(i), str(dic[i]), text)
         text = new_text
     return text

 print (replace())

问题是您复制和粘贴错误

这种模式适用于:

'(стат.{0,4}) (\d+)'
这个没有:

'(cтат.{0,4}) (\d+)'
为什么??因为在第一个搜索字符串中,第一个字符是U+0441,一个西里尔字母。但是在第二个字母中,它是一个U+0063,一个拉丁小C。当然,这两个字母在大多数字体中看起来是相同的,但它们不是同一个字符


那么,你怎么知道呢?好吧,当我怀疑这个问题时,我是这样做的:

>>> a = '(стат.{0,4}) (\d+)' # copied and pasted from your working code
>>> b = '(cтат.{0,4}) (\d+)' # copied and pasted from your broken code
>>> print(a.encode('unicode-escape').decode('ascii'))
(\u0441\u0442\u0430\u0442.{0,4}) (\\d+)
>>> print(b.encode('unicode-escape').decode('ascii'))
(c\u0442\u0430\u0442.{0,4}) (\\d+)

区别很明显:第一个有一个
\u0441
转义序列,而第二个有一个普通的ASCII
c
问题是复制和粘贴错误

这种模式适用于:

'(стат.{0,4}) (\d+)'
这个没有:

'(cтат.{0,4}) (\d+)'
为什么??因为在第一个搜索字符串中,第一个字符是U+0441,一个西里尔字母。但是在第二个字母中,它是一个U+0063,一个拉丁小C。当然,这两个字母在大多数字体中看起来是相同的,但它们不是同一个字符


那么,你怎么知道呢?好吧,当我怀疑这个问题时,我是这样做的:

>>> a = '(стат.{0,4}) (\d+)' # copied and pasted from your working code
>>> b = '(cтат.{0,4}) (\d+)' # copied and pasted from your broken code
>>> print(a.encode('unicode-escape').decode('ascii'))
(\u0441\u0442\u0430\u0442.{0,4}) (\\d+)
>>> print(b.encode('unicode-escape').decode('ascii'))
(c\u0442\u0430\u0442.{0,4}) (\\d+)

区别很明显:第一个有一个
\u0441
转义序列,而第二个有一个普通的ASCII
c

希望这是Python 3.x?如果没有,您会遇到多个问题。另外,为什么您要创建一个
final_text
变量,然后替换一个全局变量而不是使用它,然后返回全局变量?另外,您希望regexp模式上有
r
前缀,而不仅仅是替换模式。你在这里侥幸逃脱,因为在Python中,
\d
的意思恰好是
'\\d'
,但你千万不要指望这一点。最后,你为什么要做
str(i)
str(dic[i])
?您是否希望
i
dic[i]
不是字符串?还是想多复制一份?或者…?如果我不使用str(),我将返回getting TypeError:第一个参数必须是字符串或编译模式。是的,是Python 3。我对Python很陌生,所以我的代码看起来可能很愚蠢,然而,我正在尝试迭代我的字典,并使用key作为模式,dic[key]作为repl。希望这就是Python 3.x?如果没有,您会遇到多个问题。另外,为什么您要创建一个
final_text
变量,然后替换一个全局变量而不是使用它,然后返回全局变量?另外,您希望regexp模式上有
r
前缀,而不仅仅是替换模式。你在这里侥幸逃脱,因为在Python中,
\d
的意思恰好是
'\\d'
,但你千万不要指望这一点。最后,你为什么要做
str(i)
str(dic[i])
?您是否希望
i
dic[i]
不是字符串?还是想多复制一份?或者…?如果我不使用str(),我将返回getting TypeError:第一个参数必须是字符串或编译模式。是的,是Python 3。我对Python很陌生,所以我的代码看起来可能很愚蠢,然而,我正在尝试迭代我的字典,并使用key作为模式,dic[key]作为repl。是的,这是真的!谢谢!我明白了,但是,由于其他原因,代码在GUI中无法正常工作,我想。。。UPD:当然,我正在搜索«Сааа»,但我检查的文本只包含«Саа»!再次感谢您!如果这回答了您的问题,请确保!是的,这是真的!谢谢!我明白了,但是,由于其他原因,代码在GUI中无法正常工作,我想。。。UPD:当然,我正在搜索«Сааа»,但我检查的文本只包含«Саа»!再次感谢您!如果这回答了您的问题,请确保!