吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2577|回复: 10
收起左侧

[求助] 关于python和java中使用正则表达式,结果不一致问题

[复制链接]
hsgzr_sj7 发表于 2019-12-5 17:34
用两种语言 叠词切割 结果不一致,不知道是我做的那里不对
java代码:
[Java] 纯文本查看 复制代码
String s = "abc##qwe###jklllll1232222bcd####abcccc3440123324";

		//String s="abc11bcd22cdef33hjkl##opq##yut";
		String regex = "(.)\\1+";

				String[] strs = s.split(regex);

				for (int i = 0; i < strs.length; i++) {
					System.out.println(strs[i]);
				}


结果出来是:abc
qwe
jk
123
bcd
ab
3
012
24
结果是正确的

Python代码:
[Python] 纯文本查看 复制代码
s='abc##qwe###jklllll1232222bcd####abcccc3440123324'
reg='(.)\\1+'
#方法1:
s.split(reg)
#返回的还是原字符串

#方法2
import re
re.split (reg,s)
#结果是:
['abc', '#', 'qwe', '#', 'jk', 'l', '123', '2', 'bcd', '#', 'ab', 'c', '3', '4', '012', '3', '24']
#结果不正确


大家看看python是使用的不正确吗?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

XhyEax 发表于 2019-12-5 19:45
本帖最后由 XhyEax 于 2019-12-5 19:47 编辑

python字符串类的split函数不支持正则表达式,需要使用re模块。
而python和java对于该正则匹配的结果不同,导致分割不同。
[Java] 纯文本查看 复制代码
                String s = "abc##qwe###jklllll1232222bcd####abcccc3440123324";
                String regex = "(.)\\1+";

                Pattern pattern = Pattern.compile(regex);
                Matcher matcher = pattern.matcher(s);

                while (matcher.find()) {
                        String e = matcher.group();
                        System.out.println(e);
                }
输出:
##
###
lllll
2222
####
cccc
44
33
[Python] 纯文本查看 复制代码
import re
s='abc##qwe###jklllll1232222bcd####abcccc3440123324'
reg='(.)\\1+'
strs = re.findall(reg,s)
print(strs)

输出:['#', '#', 'l', '2', '#', 'c', '4', '3']
可见python只匹配到了第一个字符,而并非全部
shanglan 发表于 2019-12-5 22:29
 楼主| hsgzr_sj7 发表于 2019-12-6 08:50
二楼,是的 ,python只匹配第一个字符,正则后面的加号对它不起作用。
正则表达式是通用规则,如果出来的结果不正确,是不是可以说这个语言对正则表达式处理是有bug的?
nihuge 发表于 2019-12-6 17:33
本帖最后由 nihuge 于 2019-12-6 17:35 编辑
hsgzr_sj7 发表于 2019-12-6 08:50
二楼,是的 ,python只匹配第一个字符,正则后面的加号对它不起作用。
正则表达式是通用规则,如果出来的 ...

1575624887(1).jpg
使用的是统一规则,但是实现的具体逻辑不一样,似乎把子组的内容也放到结果内了,确实有些不合理
xuyincheng 发表于 2019-12-7 11:05
hsgzr_sj7 发表于 2019-12-6 08:50
二楼,是的 ,python只匹配第一个字符,正则后面的加号对它不起作用。
正则表达式是通用规则,如果出来的 ...

并非加号不起作用啊!!
python 正则表达式里面,有括号的话返回的是括号里面的内容,而不是整个表达式匹配的内容。。。
括号里只匹配了一个字符所以就返回一个咯!!
 楼主| hsgzr_sj7 发表于 2019-12-9 09:53
6 楼 请看一下我发的文章,JAVA匹配的结果是一样的,那PYthon匹配的结果也应该是一样的,正则表达式是通用的,出来的结果有正确的 有不正确,JAva就知道匹配多个,而pyton只知道匹配一个"."
dreamrise 发表于 2019-12-9 11:55
别在乎这些细节,直接这样取值好了:

re.split (reg,s)[::2]

[Python] 纯文本查看 复制代码
s='abc##qwe###jklllll1232222bcd####abcccc3440123324'
reg='(.)\\1+'

#方法2
import re
re.split (reg,s)[::2]



['abc', 'qwe', 'jk', '123', 'bcd', 'ab', '3', '012', '24']

 楼主| hsgzr_sj7 发表于 2019-12-9 17:29
8楼,谢谢你,结果还真的是对的,但这种字符串是没有规律的,也许 我写的这个有规律,可以通过间隔两个取值,取出来是对的,但字符串叠词是随意的,我试试可以不
 楼主| hsgzr_sj7 发表于 2019-12-10 09:18
8楼,谢谢你,还真对了,原来python使用正则表达式切割叠词时,每次都把叠词的作为一个列表元素加进了列表,所以使用re.split(reg,s)切割完成后,正好 每次被切割出的词后面跟着一个切割符,正好 通过[::2]再次对列表进行切割就成了正确结果啦
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-13 13:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表