正如标题所说:将字符串从任何情况转换为小写的最佳方法是保持部分不变?例如一个字符串,如: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's
脚本的更新版本。
>>> 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
这正是我想要的。谢谢大家的帮助。干杯!!
答案 0 :(得分:5)
你的字符串看起来总是这样吗?如果是这样,也许这就足够了:
p1,p2 = instr.split('(',1)
lc = '%s(%s' % (p1.lower(), p2)
答案 1 :(得分: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'
不需要正则表达式,只需built-in string methods
。
也适用于Python 3.2。
答案 2 :(得分:2)
您可以使用
替换正则表达式检查if ss.lower().startswith('formatdate'):
答案 3 :(得分:2)
我真的不明白你为什么要使用正则表达式?你为什么不这样做:
x, y = ss.split('(')
'('.join((x.lower(), y))
答案 4 :(得分:2)
只是为了补充Krumerlur的答案,你可能想要成功
p1,p2 = inst.split( '(' , 1 )