s1 = re.sub(r'(?<=[\u4e00-\u9fa5]) +(?=[\u4e00-\u9fa5])', '', s)
每一步都是不能调换顺序的,最先去除纯噪音数据
text = "I LOVE YOU 我 <em>爱 你。 。</em>\f \n\r"
# s1 = re.sub(r"( *。 *)+", "。", s)
# s1 = re.sub(r"(</*em>)", "", s1)
text = re.sub(r'(</*em>)', '', text)
text = re.sub(r'[\f\n\r\t\v]', '。', text)
text = re.sub(r'(?<=[\u4e00-\u9fa5。]) +(?=[\u4e00-\u9fa5。])', '', text) # Remove Chinese spaces
text = re.sub(r'。+', '。', text)
text = re.sub(r' +', ' ', text) # Remove English spaces
1. 零宽断言
无论是零宽还是断言,听起来都古古怪怪的,那先解释一下这两个词。
断言:
俗话的断言就是“我断定什么什么”,而正则中的断言,就是说正则可以指明在指定的内容的前面或后面会出现满足指定规则的内容,意思正则也可以像人类那样断定什么什么,比如"ss1aa2bb3",正则可以用断言找出aa2前面有bb3,也可以找出aa2后面有ss1.
零宽:
就是没有宽度,在正则中,断言只是匹配位置,不占字符,也就是说,匹配结果里是不会返回断言本身。意思是讲明白了,那他有什么用呢?我们来举个栗子:假设我们要用爬虫抓取csdn里的文章阅读量。通过查看源代码可以看到文章阅读量这个内容是这样的结构1 "阅读数:641"其中也就‘641’这个是变量,也就是说不同文章不同的值,当我们拿到这个字符串时,需要获得这里边的‘641’有很多种办法,但如果正则应该怎么匹配呢?下面先来讲几种类型的断言:正向先行断言(正前瞻):语法:(?=pattern)作用:匹配pattern表达式的前面内容,不返回本身。这样子说,还是一脸懵逼,好吧,回归刚才那个栗子,要取到阅读量,在正则表达式中就意味着要能匹配到‘’前面的数字内容按照上所说的正向先行断言可以匹配表达式前面的内容,那意思就是:(?=) 就可以匹配到前面的内容了。匹配什么内容呢?如果要所有内容那就是:
1 String reg=".+(?=</span>)";
2
3 String test = "<span class=\"read-count\">阅读数:641</span>";
4 Pattern pattern = Pattern.compile(reg);
5 Matcher mc= pattern.matcher(test);
6 while(mc.find()){
7 System.out.println("匹配结果:")
8 System.out.println(mc.group());
9 }
10
11 //匹配结果:
12 //阅读数:641可是老哥我们要的只是前面的数字呀,那也简单咯,匹配数字 \d,那可以改成:
1 String reg="\\d+(?=</span>)";
2 String test = "<span class=\"read-count\">阅读数:641</span>";
3 Pattern pattern = Pattern.compile(reg);
4 Matcher mc= pattern.matcher(test);
5 while(mc.find()){
6 System.out.println(mc.group());
7 }
8 //匹配结果:
9 //641大功告成!2. 正向后行断言(正后顾):语法:(?<=pattern)作用:匹配pattern表达式的后面的内容,不返回本身。有先行就有后行,先行是匹配前面的内容,那后行就是匹配后面的内容啦。上面的栗子,我们也可以用后行断言来处理.
1 //(?<=<span >阅读数:)\d+
2 String reg="(?<=<span class=\"read-count\">阅读数:)\\d+";
3
4 String test = "<span class=\"read-count\">阅读数:641</span>";
5 Pattern pattern = Pattern.compile(reg);
6 Matcher mc= pattern.matcher(test);
7 while(mc.find()){
8 System.out.println(mc.group());
9 }
10 //匹配结果:
11 //641就这么简单。3. 负向先行断言(负前瞻)语法:(?!pattern)作用:匹配非pattern表达式的前面内容,不返回本身。有正向也有负向,负向在这里其实就是非的意思。举个栗子:比如有一句 “我爱祖国,我是祖国的花朵”现在要找到不是’的花朵’前面的祖国用正则就可以这样写:1 祖国(?!的花朵)4. 负向后行断言(负后顾)语法:(?<!pattern)作用:匹配非pattern表达式的后面内容,不返回本身。2. 捕获和非捕获