我正在写一个正则表达式方程,将标点分号(:)后的大写字母更改为小写字母。
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
我的正则表达式方程式做错了什么。
答案 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)
>>>