【问题标题】:python capture group with re.subpython捕获组与re.sub
【发布时间】:2016-12-28 06:48:58
【问题描述】:

我需要使用正则表达式将字符串中每个单词的首字母大写:

>>> import re
>>> re.sub(r"\b(\S)", (r"\1").upper(), "foo bar")
'foo bar'

我希望结果是“Foo Bar”。

我尝试过title方法和string.capwords,但都存在如下问题:

>>> import string
>>> string.capwords("foo      bar   1a   ") 
'Foo Bar 1a'
>>> "1a".title() 
1A

使用@Sebastian 在下面的评论中建议的 lambda 表达式对我有用。

【问题讨论】:

  • 有必要使用正则表达式吗?你能用“foo bar”.title()吗?
  • 我试过了,但是当第一个字符是数字时,标题似乎无法正常工作。例如,我希望“1a”保持不变,但“1a”.title() 返回“1A”
  • @WesDoyle @Anand 试试string.capwords
  • 您可以使用函数/lambda 进行替换,例如re.sub(r"\b(\S)", lambda x: x.group().upper(), "foo bar")

标签: python regex


【解决方案1】:

如果您正在寻找正则表达式解决方案,re.sub 函数可以接收函数作为第二个参数:

>>> def t(x):                        
...    if x:                        
...        return x.group(0).upper()

>>> re.sub(r"\b(\S)", t, "foo bar") 
'Foo Bar'                       

>>> re.sub(r"\b(\S)", t, "1foo bar")
'1foo Bar'                      

【讨论】:

    【解决方案2】:

    这似乎也有效:

    import string
    ' '.join([string.capitalize(word) for word in 'foo      bar   1a   '.split(' ')])
    

    输出:

    'Foo      Bar   1a   '
    

    【讨论】:

      猜你喜欢
      • 2016-05-23
      • 2015-02-22
      • 1970-01-01
      • 2013-02-03
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      相关资源
      最近更新 更多