字符串操作:部分转换为小写

3
正如标题所说:将任意大小写的字符串转换为小写,同时保持一部分不变,有什么最好的方法?例如,一个字符串:FormatDate(%M)==2stArTDate(%Y/%m)==11/3,我想将其转换为 formatdate(%M)==2startdate(%Y/%m)==11/3,即除了括号()中间的部分外,其余部分都转换为小写。对于第一个例子,我想到了以下代码:
>>> import re
>>> fdt = re.compile('(F|f)(O|o)(R|r)(M|m)(A|a)(T|t)(D|d)(A|a)(T|t)(E|e)\(')
>>> ss = "forMatDate(%M)==2"
>>> if fdt.match(ss):
...   SS = ss.split('(')
...   SS[0] = SS[0].lower()
...   ss = "(".join(SS)
... 
>>> print ss
formatdate(%M)==2

虽然它能正常工作,但我不太喜欢它这样做。正则表达式很难看,而且很容易限制于特定字符串。有没有更好(因此更动态)的方法来做到这一点?提前致谢。干杯!更新:可能我没说清楚:它并不总是formatdate(),有时还有startdate()或enddate(),还有UserName==JohnDee等等..(这是用户输入的一部分),但格式始终相同,我想要可重用的东西。所以,这是基于Krumelur的脚本的更新版本。
>>> fdt = re.compile('\(%[dmwyMW].*\)')
>>> ss = "formatDate(%M)==4"
>>> st = "UserName==JohnDee"
>>>
>>> def dt_lower(sX):
...   if fdt.search(sX):
...     p1,p2 = sX.split('(',1)
...     sX = "%s(%s" % (p1.lower(), p2)
...   else: sX = sX.lower()
...   return sX
... 
>>> print dt_lower(ss)
formatdate(%M)==4
>>>
>>> print dt_lower(st)
username==johndee

这正是我想要的。感谢大家的帮助。干杯!!

5个回答

5

你的字符串总是看起来像这样吗?如果是,也许这就足够了:

p1,p2 = instr.split('(',1)
lc = '%s(%s' % (p1.lower(), p2)

2
别忘了在 lower(()) 后面加上括号。 - johnsyweb
是的,我认为“lower”是打错了。lc = '%s(%s' % (p1.lower(), p2) 可以正常工作。 - MacUsers

3

我认为你无法更加"Pythonic"了:

Python 2.7.1 (r271:86832, May 27 2011, 21:41:45) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> ss = "forMatDate(%M)==2"
>>> if ss.lower().startswith('formatdate'):
...     i,j = ss.split('(', 1)
...     ss = '('.join((i.lower(), j))
... 
>>> ss
'formatdate(%M)==2'

无需使用正则表达式,只需使用内置字符串方法即可。
同样适用于Python 3.2。

2
您可以使用以下内容替换您的正则表达式检查:
if ss.lower().startswith('formatdate'):

2

我不是很理解你为什么要使用正则表达式?为什么不直接这样做:

x, y = ss.split('(')
'('.join((x.lower(), y))

2
只是想补充一下Krumerlur的回答,您可能希望将其改为:

p1,p2 = inst.split('(',1)


该内容与编程有关。

这样你的拆分只会发生一次。其他的括号不会受到影响。 - elricL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接