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

时间:2011-06-02 09:53:37

标签: python

正如标题所说:将字符串从任何情况转换为小写的最佳方法是保持部分不变?例如一个字符串,如: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'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

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

5 个答案:

答案 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 )