忽略行首的大写单词,用正则表达式替换其他单词?

Ignore captial word at beginning of line, replace others with regex?

基本上我是想把下面这行:

TILL: LOOK we've got like a new bOArd

进入这个:

TILL: <emph>look</emph> we've got like a new b<emph>oa</emph>rd 

(行首的大写名称应保持不变)

使用此代码:

line = re.sub('(:[^A-Z]*) *([A-Z]+)', r'<emph>\L</emph>', line)

但是我得到了 /L 的“错误转义”错误,它忽略了第二个重点。 有人有解决这个问题的想法吗?

尝试:

import re

text = "TILL: LOOK we've got like a new bOArd"

s = []

for word in text.split():
    if re.search(r'([A-Z]{1,}:?)', word):
        if ':' not in word:
            word = re.sub('([A-Z]{1,})', r'<emph></emph>', word)
            word = word.lower()
    s.append(''.join(word))

s = ' '.join(s)
print(s)

输出:

TILL: <emph>look</emph> we've got like a new b<emph>oa</emph>rd

要始终跳过第一个单词并释放正则表达式,请尝试:

import re

text = "TILL: LOOK we've got like a new bOArd"

s = []

for i, word in enumerate(text.split()):
    if i > 0:
        if re.search(r'([A-Z]{1,})', word):
            word = re.sub('([A-Z]{1,})', r'<emph></emph>', word)
            word = word.lower()
    s.append(''.join(word))

s = ' '.join(s)
import re
line='TILL: LOOK we\'ve got like a new bOArd'
print(line)
line = re.sub('(:[^A-Z]*) *([A-Z]+)', r'<emph></emph>', line)
capitalized_words = r"((?:[A-Z]+ ?)+)"
m = (re.findall(capitalized_words, line))
line = re.sub(m[1],m[1].lower(),line)
print(line)

O/p: TILL:看,我们有了一个新的董事会 ['TILL'、'LOOK'、'OA'] TILL:看我们有了新的板子

您尝试 (:[^A-Z]*) *([A-Z]+) 的模式将不会匹配进一步的 bOArd,因为它们之间的其他字符仅与第二个捕获组 ([A-Z]+) 不匹配。

但是如果该组匹配该行的其余部分,您仍然需要再次从该组中单独匹配大写字符以将它们放在 <emph></emph> 标记之间。


您可以使用模式在第 1 组开始时捕获模式,并在 re.sub 的回调中检查它是否存在。

如果存在,请保持不变。如果不存在,将其替换为 <emph></emph> 标签之间的匹配项。

在回调中使用 .lower() 将大写字符转换为小写字符。

^([A-Z]+:)|[A-Z]+

说明

  • ^ 字符串开头
  • ([A-Z]+:) 捕获组 1,匹配 1 个或多个大写字符 A-Z 后跟 :
  • |
  • [A-Z]+ 匹配 1 个或多个大写字符 A-Z

参见 regex demo and a Python demo

import re

pattern = r"^([A-Z]+:)|[A-Z]+"
s = r"TILL: LOOK we've got like a new bOArd"

result = re.sub(
    pattern,
    lambda x: x.group(1) if x.group(1) else "<emph>{0}</emph>".format(x.group().lower()),
    s
)

print(result)

输出

TILL: <emph>look</emph> we've got like a new b<emph>oa</emph>rd