正如标题所说:将任意大小写的字符串转换为小写,同时保持一部分不变,有什么最好的方法?例如,一个字符串:
虽然它能正常工作,但我不太喜欢它这样做。正则表达式很难看,而且很容易限制于特定字符串。有没有更好(因此更动态)的方法来做到这一点?提前致谢。干杯!更新:可能我没说清楚:它并不总是formatdate(),有时还有startdate()或enddate(),还有UserName==JohnDee等等..(这是用户输入的一部分),但格式始终相同,我想要可重用的东西。所以,这是基于Krumelur的脚本的更新版本。
FormatDate(%M)==2
或 stArTDate(%Y/%m)==11/3
,我想将其转换为 formatdate(%M)==2
或 startdate(%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
这正是我想要的。感谢大家的帮助。干杯!!
lower(())
后面加上括号。 - johnsyweblc = '%s(%s' % (p1.lower(), p2)
可以正常工作。 - MacUsers