正则表达式,字符串按照大小写进行替换

nfer_cn 2013-11-11 07:24:26
各位好:
我在开发中碰到一个问题,需要进行字符串替换。
如:sed "s/abc/xyz/g",但是我要替换所有的abc字符串,包括abC,aBc,aBC等等,即包含所有的大小写情况,这只是条件一,条件二是要按照abc的大小写格式对应的替换成xyc对应的大小写格式,如aBc替换成xYc,AbC替换成XyC

还请各位帮忙,谢谢
...全文
1104 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
杀了这个男孩 2014-01-17
  • 打赏
  • 举报
回复
cookbook 3rd 2.6 Problem You need to search for and possibly replace text in a case-insensitive manner. Solution To perform case-insensitive text operations, you need to use the re module and supply the re.IGNORECASE flag to various operations. For example: >>> text = 'UPPER PYTHON, lower python, Mixed Python' >>> re.findall('python', text, flags=re.IGNORECASE) ['PYTHON', 'python', 'Python'] >>> re.sub('python', 'snake', text, flags=re.IGNORECASE) 'UPPER snake, lower snake, Mixed snake' >>> The last example reveals a limitation that replacing text won’t match the case of the matched text. If you need to fix this, you might have to use a support function, as in the following: def matchcase(word): def replace(m): text = m.group() if text.isupper(): return word.upper() elif text.islower(): return word.lower() elif text[0].isupper(): return word.capitalize() else: return word return replace Here is an example of using this last function: >>> re.sub('python', matchcase('snake'), text, flags=re.IGNORECASE
nfer_cn 2013-11-12
  • 打赏
  • 举报
回复
引用 5 楼 zhouchongzxc 的回复:
应该让他更复杂点 xyz替换成nba ghi替换成ihg ...替换成。。。 。。。 。。。 python如何知道捕获了什么呢? 或许perl知道
不好意思,开始没有描述清晰,后面我重新描述了一下问题。 谢谢
nfer_cn 2013-11-12
  • 打赏
  • 举报
回复
引用 4 楼 yunbiquan 的回复:
import re text='abcxyc123AbCskdjklaABC' pattern=re.compile('abc', re.I) result=pattern.findall(text) if result is not None: for i in xrange(len(result)): text=text.replace(result[i],'%s%s%s'%(chr(ord(result[i][0])+23), chr(ord(result[i][1])+23),chr(ord(result[i][2])+23))) print aa 貌似不能直接按照abc的格式替换成xyz,所以要分别转换。如果替换的字符串不一定是xyz,那可以写个替换函数。暂时想到这种挫办法。。
非常感谢,方法很好,而且,完全符合我的需求,谢谢
panghuhu250 2013-11-12
  • 打赏
  • 举报
回复
用python的话:
In [45]: import re

In [46]: def convert(s):
    ...:     return re.sub('abc', lambda m: ''.join(chr(ord(c)+23) for c in m.group(0)), s, flags=re.I)

In [46]: 

In [47]: convert('aBcde')
Out[47]: 'xYzde'

In [48]: convert('xABC')
Out[48]: 'xXYZ'
nfer_cn 2013-11-12
  • 打赏
  • 举报
回复
引用 3 楼 bugs2k 的回复:
while (<DATA>) {
	s/([abcABC])/chr(23+ord($1))/ge;
	print;
}

__DATA__
abcxyc123AbCskdjklaABC
非常感谢您的回复。 同时真心对各位说声对不起,我对问题的描述能力实在是太差了。 重新描述一下: a. 在文本中匹配制定的字符串,大小写不限。 b. 将匹配出的字符串替换成另一个制定的字符串,原字符串和替换的字符串长度一致。 c. 在匹配的同时,保持大小写不变。 因此,这里面就有几个问题: 1) 匹配的字符串和替换的字符串并不是连续的,如abc或者xyz,上述只是一个例子 2) 匹配的时候是按字符串匹配的,并不是针对每一个字符,所以s/([abcABC])/chr(23+ord($1))/ge这种写法肯定不可以 这个要求有些奇怪,还请您能帮忙解决,谢谢
ChongQingJin28 2013-11-12
  • 打赏
  • 举报
回复
我明白你的意思。你明白我的意思吗?
ChongQingJin28 2013-11-11
  • 打赏
  • 举报
回复
应该让他更复杂点
xyz替换成nba
ghi替换成ihg
...替换成。。。
。。。
。。。

python如何知道捕获了什么呢?
或许perl知道
yunbiquan 2013-11-11
  • 打赏
  • 举报
回复
import re text='abcxyc123AbCskdjklaABC' pattern=re.compile('abc', re.I) result=pattern.findall(text) if result is not None: for i in xrange(len(result)): text=text.replace(result[i],'%s%s%s'%(chr(ord(result[i][0])+23), chr(ord(result[i][1])+23),chr(ord(result[i][2])+23))) print aa 貌似不能直接按照abc的格式替换成xyz,所以要分别转换。如果替换的字符串不一定是xyz,那可以写个替换函数。暂时想到这种挫办法。。
bugs2k 2013-11-11
  • 打赏
  • 举报
回复
while (<DATA>) {
	s/([abcABC])/chr(23+ord($1))/ge;
	print;
}

__DATA__
abcxyc123AbCskdjklaABC
nfer_cn 2013-11-11
  • 打赏
  • 举报
回复
引用 1 楼 bugs2k 的回复:
while (<DATA>) {
	s/(\w)/chr(23+ord($1))/ge;
	print;
}

__DATA__
abC
aBc
aBC
非常感谢,我要解决的问题不是对每一个字符进行+23处理,而是,只针对abc,比如 原始字符串是 :abcxyc123AbCskdjklaABC 替换后的字符串:xycxyc123XyZskdjklaXYZ
bugs2k 2013-11-11
  • 打赏
  • 举报
回复
while (<DATA>) {
	s/(\w)/chr(23+ord($1))/ge;
	print;
}

__DATA__
abC
aBc
aBC

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧