[('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
因为需要大小写,所以只是U不够
#4
请问你的是什么版本呢,我的是python3.3
得到的依然是[]
#5
奇怪哦,不用\1,这样子是可以的。
re.findall(u'(\\d)(asd)\\d',u"中文 4asd4",re.I|re.U)
re.findall(u'(\\d)(asd)\\d',u"中文 4asd4",re.I|re.U)
#6
嗯嗯,是的喔,搞了很久,本来是正则匹配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)
[]
奇怪呢
>>> 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
能不能这样写?
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 就能匹配了
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
那如果是
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 测试结果
莫非IDLE里面的字串不是utf-8?
>>> 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
果然
在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
其次,纯ascii字串使用反向引用也没问题
有问题的是unicode + 反向引用,似乎要指定re.U & re.I
#20
bug……
#21
没有用 \1,没满足题目要求。
re.U & re.I 的值就是0了。
估计是 bug
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')]
>>>
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,})这个为什么不行?
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)
这样得不到结果
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')]
>>>
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
各位, 后面的'\1'表示什么啊?麻烦解答下!
#27
反向引用刚才的第一对括号匹配到的东西。
#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
因为需要大小写,所以只是U不够
#4
请问你的是什么版本呢,我的是python3.3
得到的依然是[]
#5
奇怪哦,不用\1,这样子是可以的。
re.findall(u'(\\d)(asd)\\d',u"中文 4asd4",re.I|re.U)
re.findall(u'(\\d)(asd)\\d',u"中文 4asd4",re.I|re.U)
#6
嗯嗯,是的喔,搞了很久,本来是正则匹配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)
[]
奇怪呢
>>> 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
能不能这样写?
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 就能匹配了
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
那如果是
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 测试结果
莫非IDLE里面的字串不是utf-8?
>>> 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
果然
在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
其次,纯ascii字串使用反向引用也没问题
有问题的是unicode + 反向引用,似乎要指定re.U & re.I
#20
bug……
#21
没有用 \1,没满足题目要求。
re.U & re.I 的值就是0了。
估计是 bug
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')]
>>>
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,})这个为什么不行?
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)
这样得不到结果
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')]
>>>
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
各位, 后面的'\1'表示什么啊?麻烦解答下!
#27
反向引用刚才的第一对括号匹配到的东西。
#28
过了好久了,貌似没有完美的解决方法,结贴