使用正则表达式python标点符号后的小写字母

时间:2018-10-29 06:26:22

标签: regex python-3.x

我正在写一个正则表达式方程,将标点分号(:)后的大写字母更改为小写字母。

str = "hello: You"
re.sub("(.*):(\s.*?)([A-Za-z]+)",lambda p: p.group(3).lower(),str)
  

当单词是字母数字时,它不应执行任何操作。正则表达式中的y group(3)不包含字母。

str = "hello: 12AE12"
re.sub("(.*):(\s.*?)([A-Za-z]+)",lambda p: p.group(3).lower(),str)

它返回

  

ae12

我的正则表达式方程式做错了什么。

4 个答案:

答案 0 :(得分:0)

我不明白您最终如何使用当前模式,但是我建议您使用这种模式:

.*:\s+([A-Za-z]+)\b

您只需要在这里真正拥有一个捕获组即可。另外,为简化起见,我只使用并忽略冒号,然后是空白,然后是捕获组。

str = "hello: You"
print(re.sub(".*:\s+([A-Za-z]+)\b", lambda p: p.group(1).lower(),str))

you

str = "hello: 12AE12"
print(re.sub(".*:\s+([A-Za-z]+)\b", lambda p: p.group(1).lower(),str))

12AE12

答案 1 :(得分:0)

您最后一组的字符集

([A-Za-z]+)

不能保证它以单词结尾结尾。因此,如果在该组中至少可以匹配一个个字母字符,则在:之后的单词的开头,即使该单词实际上是字母数字字符,该正则表达式也会成功。而是在单词的末尾添加单词边界,以确保字符集在单词的末尾终止,否则匹配将完全失败:

re.sub("(.*):(\s.*?)([A-Za-z]+)\b",lambda p: p.group(3).lower(),str)
#                              ^^

答案 2 :(得分:0)

如何使用或(|)语句。如果匹配是字母数字,则该单词将被第四组匹配。

import re

strs = ["hello: You", "hello: 12AE12"]

p = re.compile(r"(.*):(\s*)(?:([A-Za-z]*)|([A-Za-z0-9]*))$")

for s in strs:
    m = p.search(s)
    if m.group(3):
        print(m.group(3).lower())
    elif m.group(4):
        print(m.group(4))

答案 3 :(得分:0)

也许这会有所帮助:

str1 = "hello: You"
str2 = "hello: 12AE12"

def caps_to_lower(obj):
    m = re.search('.*:\s+([a-zA-Z]+)', obj)
    if m:
        return m.group(1).lower()

>>> caps_to_lower(str1)
'you'
>>> caps_to_lower(str2)
>>>