忽略行首的大写单词,用正则表达式替换其他单词?
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
基本上我是想把下面这行:
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