正则,使用分组引用来匹配中文时无法匹配

时间:2022-06-27 15:11:43
>>> re.findall('(\\d)(asd)\\1'," 4asd4",re.I)
[('4', 'asd')]
>>> re.findall('(\\d)(asd)\\1',"中文 4asd4",re.I)
[]
>>> re.findall(u'(\\d)(asd)\\1',u"中文 4asd4",re.I)
[]
请问这个问题要如何解决?

28 个解决方案

#1


re.findall('(\\d)(asd)\\1',"中文 4asd4",re.U)
U

#2


>>> re.findall(r'(\d)(asd)\1',"中文 4asd4",re.I|re.U)
[('4', 'asd')]

#3


引用 楼主 zeroczh 的回复:
>>> re.findall('(\\d)(asd)\\1'," 4asd4",re.I)
[('4', 'asd')]
>>> re.findall('(\\d)(asd)\\1',"中文 4asd4",re.I)
[]
>>> re.findall(u'(\\d)(asd)\\1',u"中文 4asd4",re.I)
[]
请问这个问题要如何解决?

 ……

因为需要大小写,所以只是U不够

#4


引用 1 楼 zjs100901 的回复:
Python code?1re.findall('(\\d)(asd)\\1',"中文 4asd4",re.U)U

请问你的是什么版本呢,我的是python3.3
得到的依然是[]

#5


奇怪哦,不用\1,这样子是可以的。
re.findall(u'(\\d)(asd)\\d',u"中文 4asd4",re.I|re.U)

#6


引用 5 楼 zjs100901 的回复:
奇怪哦,不用\1,这样子是可以的。
re.findall(u'(\\d)(asd)\\d',u"中文 4asd4",re.I|re.U)

嗯嗯,是的喔,搞了很久,本来是正则匹配HTML里面的引号的,因为引号可以是单引号或者是双引号,而且要匹配

#7


我用的是Python 3.3
>>> re.findall('(\d)\d',"44",re.I|re.U)
['4']
>>> re.findall('(\d)\1',"44",re.I|re.U)
[]
>>> re.findall('(\d)\1',"44",re.U)
[]
>>> re.findall('(\d)\1',"44",re.I)
[]
奇怪呢

#8


3.3没有re.U,本来字串就是utf-8,最好用r''来写正则式

#9


引用 8 楼 snmr_com 的回复:
3.3没有re.U,本来字串就是utf-8,最好用r''来写正则式

能不能这样写?
re.findall(r'(\d)(asd)\1', "中文 4asd4", re.I)

re.findall(r'(\d)(asd)\d', "中文 4asd4", re.I)
结果很奇怪!

#10


re.I 
re.IGNORECASE 
Perform case-insensitive matching; expressions like [A-Z] will match lowercase letters, too. This is not affected by the current locale and works for Unicode characters as expected.

就是说,unicode下面用 re.I 达不到效果,去掉 re.I 就能匹配了

#11


要在研究一下,这个影响比较大……  正则,使用分组引用来匹配中文时无法匹配

#12


Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import re
>>> re.findall(r'(\d)(asd)\1', "中文 4asd4")
[('4', 'asd')]
>>>
 

#13


引用 10 楼 snmr_com 的回复:
re.I 
re.IGNORECASE 
Perform case-insensitive matching; expressions like [A-Z] will match lowercase letters, too. This is not affected by the current locale and works for Unicode charac……

那如果是
 re.findall('(\\d)(asd)\\1',"中文 4ASD4")
这样呢,要ingore

#14


那如果楼主要求忽略大小写,该咋办?

>>> re.findall(r'(\d)(asd)\1', "中文 4asd4" )
[('4', 'asd')]
>>> re.findall(r'(\d)(asd)\1', "中文 4ASD4" )
[]

#15


3.3 测试结果

>>> re.findall(r'(\d)(asd)\1',"中文 4asd4",re.U&re.I)
[('4', 'asd')]
>>> re.findall(r'(\d)(asd)\1',"中文 4asd4",re.U|re.I)
[]


莫非IDLE里面的字串不是utf-8?

#16


Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import re
>>> re.findall(r'(\d)([a-zA-Z]+)\1',"中文 4ASD4")
[('4', 'ASD')]
>>> re.findall(r'(\d)([a-zA-Z]+)\1',"中文 4asd4")
[('4', 'asd')]
>>>
 
貌似比较别扭

#17


引用 15 楼 snmr_com 的回复:
3.3 测试结果
Python code?1234>>> re.findall(r'(\d)(asd)\1',"中文 4asd4",re.U&re.I)[('4', 'asd')]>>> re.findall(r'(\d)(asd)\1',"中文 4asd4",re.U|re.I)[]

莫非IDLE里面的字串不是utf-8?


果然
在command line 下
re.findall(u'(\\d)(asd)\\d',u"中文 4asd4",re.I|re.U)
的出正确结果

#18


re.findall(u'(\\d)(asd)\\d',u"中文 4aSd4",re.I|re.U)
是这样

#19


首先,可以确定用\d代替\1是没问题的
其次,纯ascii字串使用反向引用也没问题

有问题的是unicode + 反向引用,似乎要指定re.U & re.I

#20


bug……  正则,使用分组引用来匹配中文时无法匹配

#21


引用 18 楼 zeroczh 的回复:
re.findall(u'(\\d)(asd)\\d',u"中文 4aSd4",re.I|re.U)
是这样
没有用 \1,没满足题目要求。

引用 19 楼 snmr_com 的回复:
首先,可以确定用\d代替\1是没问题的
其次,纯ascii字串使用反向引用也没问题

有问题的是unicode + 反向引用,似乎要指定re.U & re.I
re.U & re.I 的值就是0了。
估计是 bug

#22


嗯,貌似bug。试了其它正则模块正常...

regex: an alternative regular expression module, to replace re.

>>> import regex as re
>>> re.findall(r'(\d)(asd)\1',"中文4aSd4", re.I)
[('4', 'aSd')]
>>> 

#23


试了下转为 非Unicode的编码可以实现
re.findall('(\\d)(asd)\\1'.encode("gb2312"),"中文 4aSd4".encode("gb2312"),re.I)

如果分组也是中文的话
re.findall('([\\u4e00-\\u9fa5]*)(asd)\\1'.encode("gb2312"),"中文 中aSd中".encode("gb2312"),re.I)

但是请问,如果是匹配一个中文的话,正则怎么写
([\\u4e00-\\u9fa5]{1,})这个为什么不行?

#24


这样也可以
re.findall('([\\u4e00-\\u9fa5]*)(asd)\\1'.encode("utf8"),"中文 中aSd中".encode("utf8"),re.I)
[(b'', b'aSd')]
但是第一个分组是用*来匹配,所以第一个分组结果是""
其他
re.findall('([\'"])(asd)\\1'.encode("utf8"),"中文 'aSd'".encode("utf8"),re.I) 而这个
返回的结果正确
[(b"'", b'aSd')]

剩下一个问题就是,如何匹配中文个数的数目呢
例如我只想匹配后一个中文字
re.findall('([\\u4e00-\\u9fa5]{1,})(asd)\\1'.encode("utf8"),"中文 中aSd中".encode("utf8"),re.I)
这样得不到结果

#25


中文unicode下才会方便,避开re.I,英文大小写嘛就用简单笨拙的方法吧...

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import re
>>> re.findall(r'(.)([aA][sS][dD])\1', "中文 中aSd中")
[('中', 'aSd')]
>>> re.findall(r'(.)([aA][sS][dD])\1', "中文 'aSd'")
[("'", 'aSd')]
>>> re.findall(r'(.)([aA][sS][dD])\1', "中文 4aSd4")
[('4', 'aSd')]
>>>

#26


引用 25 楼 angel_su 的回复:
中文unicode下才会方便,避开re.I,英文大小写嘛就用简单笨拙的方法吧...

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for……


各位, 后面的'\1'表示什么啊?麻烦解答下!

#27


引用 26 楼 maniachhz 的回复:
引用 25 楼 angel_su 的回复:中文unicode下才会方便,避开re.I,英文大小写嘛就用简单笨拙的方法吧...

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credit……
反向引用刚才的第一对括号匹配到的东西。

#28


过了好久了,貌似没有完美的解决方法,结贴

#1


re.findall('(\\d)(asd)\\1',"中文 4asd4",re.U)
U

#2


>>> re.findall(r'(\d)(asd)\1',"中文 4asd4",re.I|re.U)
[('4', 'asd')]

#3


引用 楼主 zeroczh 的回复:
>>> re.findall('(\\d)(asd)\\1'," 4asd4",re.I)
[('4', 'asd')]
>>> re.findall('(\\d)(asd)\\1',"中文 4asd4",re.I)
[]
>>> re.findall(u'(\\d)(asd)\\1',u"中文 4asd4",re.I)
[]
请问这个问题要如何解决?

 ……

因为需要大小写,所以只是U不够

#4


引用 1 楼 zjs100901 的回复:
Python code?1re.findall('(\\d)(asd)\\1',"中文 4asd4",re.U)U

请问你的是什么版本呢,我的是python3.3
得到的依然是[]

#5


奇怪哦,不用\1,这样子是可以的。
re.findall(u'(\\d)(asd)\\d',u"中文 4asd4",re.I|re.U)

#6


引用 5 楼 zjs100901 的回复:
奇怪哦,不用\1,这样子是可以的。
re.findall(u'(\\d)(asd)\\d',u"中文 4asd4",re.I|re.U)

嗯嗯,是的喔,搞了很久,本来是正则匹配HTML里面的引号的,因为引号可以是单引号或者是双引号,而且要匹配

#7


我用的是Python 3.3
>>> re.findall('(\d)\d',"44",re.I|re.U)
['4']
>>> re.findall('(\d)\1',"44",re.I|re.U)
[]
>>> re.findall('(\d)\1',"44",re.U)
[]
>>> re.findall('(\d)\1',"44",re.I)
[]
奇怪呢

#8


3.3没有re.U,本来字串就是utf-8,最好用r''来写正则式

#9


引用 8 楼 snmr_com 的回复:
3.3没有re.U,本来字串就是utf-8,最好用r''来写正则式

能不能这样写?
re.findall(r'(\d)(asd)\1', "中文 4asd4", re.I)

re.findall(r'(\d)(asd)\d', "中文 4asd4", re.I)
结果很奇怪!

#10


re.I 
re.IGNORECASE 
Perform case-insensitive matching; expressions like [A-Z] will match lowercase letters, too. This is not affected by the current locale and works for Unicode characters as expected.

就是说,unicode下面用 re.I 达不到效果,去掉 re.I 就能匹配了

#11


要在研究一下,这个影响比较大……  正则,使用分组引用来匹配中文时无法匹配

#12


Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import re
>>> re.findall(r'(\d)(asd)\1', "中文 4asd4")
[('4', 'asd')]
>>>
 

#13


引用 10 楼 snmr_com 的回复:
re.I 
re.IGNORECASE 
Perform case-insensitive matching; expressions like [A-Z] will match lowercase letters, too. This is not affected by the current locale and works for Unicode charac……

那如果是
 re.findall('(\\d)(asd)\\1',"中文 4ASD4")
这样呢,要ingore

#14


那如果楼主要求忽略大小写,该咋办?

>>> re.findall(r'(\d)(asd)\1', "中文 4asd4" )
[('4', 'asd')]
>>> re.findall(r'(\d)(asd)\1', "中文 4ASD4" )
[]

#15


3.3 测试结果

>>> re.findall(r'(\d)(asd)\1',"中文 4asd4",re.U&re.I)
[('4', 'asd')]
>>> re.findall(r'(\d)(asd)\1',"中文 4asd4",re.U|re.I)
[]


莫非IDLE里面的字串不是utf-8?

#16


Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import re
>>> re.findall(r'(\d)([a-zA-Z]+)\1',"中文 4ASD4")
[('4', 'ASD')]
>>> re.findall(r'(\d)([a-zA-Z]+)\1',"中文 4asd4")
[('4', 'asd')]
>>>
 
貌似比较别扭

#17


引用 15 楼 snmr_com 的回复:
3.3 测试结果
Python code?1234>>> re.findall(r'(\d)(asd)\1',"中文 4asd4",re.U&re.I)[('4', 'asd')]>>> re.findall(r'(\d)(asd)\1',"中文 4asd4",re.U|re.I)[]

莫非IDLE里面的字串不是utf-8?


果然
在command line 下
re.findall(u'(\\d)(asd)\\d',u"中文 4asd4",re.I|re.U)
的出正确结果

#18


re.findall(u'(\\d)(asd)\\d',u"中文 4aSd4",re.I|re.U)
是这样

#19


首先,可以确定用\d代替\1是没问题的
其次,纯ascii字串使用反向引用也没问题

有问题的是unicode + 反向引用,似乎要指定re.U & re.I

#20


bug……  正则,使用分组引用来匹配中文时无法匹配

#21


引用 18 楼 zeroczh 的回复:
re.findall(u'(\\d)(asd)\\d',u"中文 4aSd4",re.I|re.U)
是这样
没有用 \1,没满足题目要求。

引用 19 楼 snmr_com 的回复:
首先,可以确定用\d代替\1是没问题的
其次,纯ascii字串使用反向引用也没问题

有问题的是unicode + 反向引用,似乎要指定re.U & re.I
re.U & re.I 的值就是0了。
估计是 bug

#22


嗯,貌似bug。试了其它正则模块正常...

regex: an alternative regular expression module, to replace re.

>>> import regex as re
>>> re.findall(r'(\d)(asd)\1',"中文4aSd4", re.I)
[('4', 'aSd')]
>>> 

#23


试了下转为 非Unicode的编码可以实现
re.findall('(\\d)(asd)\\1'.encode("gb2312"),"中文 4aSd4".encode("gb2312"),re.I)

如果分组也是中文的话
re.findall('([\\u4e00-\\u9fa5]*)(asd)\\1'.encode("gb2312"),"中文 中aSd中".encode("gb2312"),re.I)

但是请问,如果是匹配一个中文的话,正则怎么写
([\\u4e00-\\u9fa5]{1,})这个为什么不行?

#24


这样也可以
re.findall('([\\u4e00-\\u9fa5]*)(asd)\\1'.encode("utf8"),"中文 中aSd中".encode("utf8"),re.I)
[(b'', b'aSd')]
但是第一个分组是用*来匹配,所以第一个分组结果是""
其他
re.findall('([\'"])(asd)\\1'.encode("utf8"),"中文 'aSd'".encode("utf8"),re.I) 而这个
返回的结果正确
[(b"'", b'aSd')]

剩下一个问题就是,如何匹配中文个数的数目呢
例如我只想匹配后一个中文字
re.findall('([\\u4e00-\\u9fa5]{1,})(asd)\\1'.encode("utf8"),"中文 中aSd中".encode("utf8"),re.I)
这样得不到结果

#25


中文unicode下才会方便,避开re.I,英文大小写嘛就用简单笨拙的方法吧...

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import re
>>> re.findall(r'(.)([aA][sS][dD])\1', "中文 中aSd中")
[('中', 'aSd')]
>>> re.findall(r'(.)([aA][sS][dD])\1', "中文 'aSd'")
[("'", 'aSd')]
>>> re.findall(r'(.)([aA][sS][dD])\1', "中文 4aSd4")
[('4', 'aSd')]
>>>

#26


引用 25 楼 angel_su 的回复:
中文unicode下才会方便,避开re.I,英文大小写嘛就用简单笨拙的方法吧...

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for……


各位, 后面的'\1'表示什么啊?麻烦解答下!

#27


引用 26 楼 maniachhz 的回复:
引用 25 楼 angel_su 的回复:中文unicode下才会方便,避开re.I,英文大小写嘛就用简单笨拙的方法吧...

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credit……
反向引用刚才的第一对括号匹配到的东西。

#28


过了好久了,貌似没有完美的解决方法,结贴