正则表达式的泛搜索和替换怎么实现?

Vim、Emacs配置和使用
回复
jsjcjsjc
帖子: 152
注册时间: 2007-03-03 13:36

正则表达式的泛搜索和替换怎么实现?

#1

帖子 jsjcjsjc » 2016-06-30 12:57

例子如下:找到后怎么再进行泛替换?

1.ABAB型
ABAB替换成AB
adodoy->adoy
aoyoyhf->aoyhf
ABAB替换成ABABAB
adodoy->adododoy
aoyoyhf->aoyoyoyhf

2.ABB型
ABB型替换成BBA
wlook->wllok
dlaay->dllay

3.ABA型
ABA型替换成BAB
where->whrer
orogeny->rorgeny

非常感谢您的关注 :em06
头像
HuntXu
帖子: 5776
注册时间: 2007-09-29 3:09

Re: 正则表达式的泛搜索和替换怎么实现?

#2

帖子 HuntXu » 2016-07-01 9:26

试了一下,至少sed里面的正则是可以这么做的,其他地方的正则应该类似,更不用说python什么的

1. 找重复出现的ABAB可以用(..)\1来搜到,比如说

1) ABAB变AB

代码: 全选

$ echo adodoy|sed -r 's/(..)\1/\1/'
adoy
2) ABAB变ABABAB

代码: 全选

echo adodoy|sed -r 's/(..)\1/\1\1\1/'
2. 找ABB可以用(.)(.)\2
1) ABB变AAB,你的要求是说ABB变BBA,可是给出的例子却不同,不过反正差不多,调整一下替换内容的顺序即可

代码: 全选

echo wlook|sed -r 's/(.)(.)\2/\1\1\2/'
wllok
第三个不回答了,反正和第二个差不多,自己想去,不要那么容易做伸手党

另外有个要说清楚的地方,正则只管匹配/搜索,至于替换那是各家编辑器的事情(或者各种脚本程序),只不过通常后者都提供了将前者匹配到的某些部分记录下来并且应用在替换过程中的功能而已,如上文sed中的s///是替换,\1\2是在sed的替换命令中表示前面正则搜索中的子表达式
HUNT Unfortunately No Talent...
jsjcjsjc
帖子: 152
注册时间: 2007-03-03 13:36

Re: 正则表达式的泛搜索和替换怎么实现?

#3

帖子 jsjcjsjc » 2016-07-01 10:03

HuntXu 写了:试了一下,至少sed里面的正则是可以这么做的,其他地方的正则应该类似,更不用说python什么的

1. 找重复出现的ABAB可以用(..)\1来搜到,比如说

1) ABAB变AB

代码: 全选

$ echo adodoy|sed -r 's/(..)\1/\1/'
adoy
2) ABAB变ABABAB

代码: 全选

echo adodoy|sed -r 's/(..)\1/\1\1\1/'
2. 找ABB可以用(.)(.)\2
1) ABB变AAB,你的要求是说ABB变BBA,可是给出的例子却不同,不过反正差不多,调整一下替换内容的顺序即可

代码: 全选

echo wlook|sed -r 's/(.)(.)\2/\1\1\2/'
wllok
第三个不回答了,反正和第二个差不多,自己想去,不要那么容易做伸手党

另外有个要说清楚的地方,正则只管匹配/搜索,至于替换那是各家编辑器的事情(或者各种脚本程序),只不过通常后者都提供了将前者匹配到的某些部分记录下来并且应用在替换过程中的功能而已,如上文sed中的s///是替换,\1\2是在sed的替换命令中表示前面正则搜索中的子表达式

非常感谢~~~我也正在学习,只是一旦不用就会忘记~~~
回复