【问题标题】:Ignore captial word at beginning of line, replace others with regex?忽略行首的大写单词,用正则表达式替换其他单词?
【发布时间】:2021-08-15 10:20:00
【问题描述】:

基本上我正在尝试转以下行:

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'\1<emph>\L\2</emph>', line)

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

【问题讨论】:

  • 虽然可以使用正则表达式执行此操作,但您为什么不能使用代码“手动”执行此操作?你得到的错误很简单: \L is not a valid escape ,你希望它能做什么?

标签: python regex capitalization


【解决方案1】:

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

但如果该组与该行的其余部分匹配,您仍然必须再次将大写字符与该组分开匹配,以将它们放置在&lt;emph&gt;&lt;/emph&gt; 标记之间。


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

如果确实存在,请保持不变。如果不存在,则将其替换为&lt;emph&gt;&lt;/emph&gt;标签之间的匹配项。

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

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

说明

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

参见regex demoPython 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

【讨论】:

    【解决方案2】:
    import re
    line='TILL: LOOK we\'ve got like a new bOArd'
    print(line)
    line = re.sub('(:[^A-Z]*) *([A-Z]+)', r'\1<emph>\2</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:看,我们有一个新的董事会 ['直到','看','OA'] TILL:看起来我们已经有了一个新的董事会

    【讨论】:

      【解决方案3】:

      试试:

      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>\1</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>\1</emph>', word)
                  word = word.lower()
          s.append(''.join(word))
      
      s = ' '.join(s)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-06
        相关资源
        最近更新 更多