【问题标题】:How do I prepend to the beginning of a string in Python using re.sub()?如何使用 re.sub() 在 Python 中添加字符串的开头?
【发布时间】:2021-05-31 19:52:34
【问题描述】:

我在 Python 中使用 RegEx 在文本文件中搜索名册中出现的名称,然后附加一个“!”字符到字符串的开头。例如:

名册 = ["name1," "name2," "name3"]

原始字符串 = "name1 回家了。"

输出字符串 - “!name1 回家了。”

我找到了this thread 关于如何附加到字符串末尾的信息,我成功地用于此目的。我已经修改了 RegEx 以在字符串的开头附加,但没有成功。我的尝试如下 - 有什么建议吗?

with open("File.txt", 'r+') as f:
   s = f.read()
   new_s = re.sub(r'^(.*{}.*)^'.format(re.escape("name1")), lambda g: g.group(0) + "!", s, flags=re.MULTILINE)
   f.seek(0)
   f.write(new_s)

【问题讨论】:

  • 您的意思是$ 表示行尾吗?或\Z 表示字符串结尾?
  • 您所展示的尝试到底有什么问题?您是否尝试过使用'!' + ... 而不是... + '!'
  • 请注意,您可以逐行阅读,这将使代码更简单。此外,这里不需要 lambda,\g<0> 是对整个比赛的反向引用。或者,您可以使用\1,因为您使用捕获组包装了整个模式。主要的是 ^re.M 在 LF 字符之后匹配,而 . 默认情况下不匹配 LF 字符。但是在这里使用re.S / re.DOTALL 并不是一个好主意。
  • 这个词是“前置”。 “追加”特定于末尾,“前置”用于将某些内容放在开头。
  • 仍然,name 和输入中的数字之间真的有空格吗,搜索短语中没有空格?搜索词组末尾是否真的包含逗号?如果这些是拼写错误,请尝试ideone.com/AyYaJh

标签: python regex


【解决方案1】:

去掉.*s - 匹配太多数据会使你的逻辑比它应该的更复杂,没有充分的理由。你的正则表达式不需要被锚定,你也不需要在这里re.MULTILINE(因为没有一个匹配会跨越多行)。

import re

roster = ["name1", "name2", "name3"]
roster_re = re.compile(r'\b(' + '|'.join(re.escape(s) for s in roster) + r')\b')

with open("File.txt", 'r+') as f:
    new_content = roster_re.sub(lambda s: ('!'+s.group(0)), f.read())
    # Note that this is not a safe way to rewrite a file in place; may corrupt data
    f.seek(0)
    f.truncate()
    f.write(new_content)

请参阅How to safely write to a file?,了解您需要进行哪些更改以避免脚本在运行中失败时损坏您的数据文件(系统遇到不合时宜的重新启动、正在写入的文件服务器出现故障等)。

【讨论】:

  • 非常感谢您的帮助! RegEx 新手,我还有很多东西要学!
  • 请注意,正则表达式本身进行匹配——“我如何使用正则表达式来更改某些内容?”是一个暗示你不是 just 使用正则表达式的问题;在这种情况下,您正在使用 re.sub 提供的额外功能,超出了正则表达式(在正式的数学/学术环境中)被理解为能够执行的严格范围。
  • 另外,如果您不熟悉正则表达式,我强烈建议阅读swtch.com/~rsc/regexp/regexp1.html 的论文,讨论更现代的正则表达式实现往往更糟糕 i> 比几十年前的那些。 (那篇论文开始发生翻天覆地的变化,所以事情又开始好转了,但即便如此,它仍然值得一读,以帮助了解有关 为什么 正则表达式库正在发生变化以及某些功能发生变化的背景Perl 社区添加的内容正在逐步淘汰,至少部分)。
猜你喜欢
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 2017-11-24
  • 2021-12-20
相关资源
最近更新 更多