删除第一个字符(Regex)

2024-09-25 06:33:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个正则表达式: (?<=[.!?])\s[A-Z] 我在这段文字上运行:

The engineering plant, weapon and electronic systems, galley, and multitudinous other
equipment required to transform the new hull into an operating and habitable warship are
installed and tested. The prospective commanding officer, ship's officers, the petty
officers, and seamen who will form the crew report for training and intensive
familiarization with their new ship.

它产生:

^{pr2}$

如您所见,它删除了句子的第一个字母。这并不是因为它们被资本化了(我测试过)。在

如何修复它,使它不删除句子的第一个字母?在

(我使用的是python3)

我用过重新分割()然后打印数组,用换行符分隔每个值


Tags: andthenew字母句子electronic文字systems
2条回答

正则表达式匹配空白字符和大写ASCII字母,但前提是它们前面有点、感叹号或问号。在

使用它拆分文本时,大写字母将成为用于拆分的分隔符的一部分,因此将被删除。在

将regex更改为

(?<=[.!?])\s(?=[A-Z])

这封信不会成为比赛的一部分。在

不过,要注意两件事:

  1. 只有当新句子以ASCII字母开头时,这才有效。对于大多数英语句子来说,你可能没问题,但对于其他语言来说肯定不行。在
  2. 如果文本包含缩写,可能会出现一些错误的拆分:Mr. Smith和{}将被一分为二。在

问题出在您的regex中,奇怪的是,当您使用“非消耗性标记”(即正查找)作为标点((?<=[.!?]))时,却没有用于检测每个句子的第一个字母([A-Z])。在

因此,您在split()中使用的regex将使用每个匹配项的第一个大写字母。您可能打算不使用它(即,只使用中间的空格),在这种情况下,您希望使用不消耗文本的正向前瞻:

(?<=[.!?])\s(?=[A-Z])

Lookaheads和lookbehind通常是锚定,锚定不消耗输入中的任何文本。当然,最常用的锚定是^和{}。它们只匹配输入文本中的位置,这正是您想要的。在

lookbehind将匹配前面的文本到位置必须匹配/不匹配给定正则表达式的位置,而lookahead将匹配一个位置,其中后面的文本必须匹配/不匹配给定的regex。在一个匹配的空格之后,您需要的是一个后面是大写字母的位置,因此需要使用一个正的lookahead((?=<re>),其中{}是regex)匹配一个大写字母(<re>是{})。在

相关问题 更多 >