【问题标题】:How to merge these two regular expressions? [duplicate]如何合并这两个正则表达式? [复制]
【发布时间】:2020-08-04 04:22:47
【问题描述】:
p1 = re.compile(r"https?:[^\s]+[a-zA-Z0-9]")

p2 = re.compile("([\u4E00-\u9FD5a-zA-Z0-9+#&\._%\-]+)", re.U)

我想将这两种模式合并为一个,然后我可以使用'split'功能根据统一的正则表达式来分割文本。怎么做?是否有某种模式联合操作,如:

p = p1 + p2

p1 是匹配 URL 字符串的模式,p2 是基于某些字符将文本拆分为块的模式。我想得到一个匹配 p1 或 p2 的新模式。这是在 Python 中。

举例说明:

text = This is a https://www.stackoverflow.com/posts/32244/edits example.

如果我只是应用p2,文本会被拆分成:

['This', ' ', 'is', ' ', 'a', ' ','https', '://', 'www.stackoverflow.com', '/', 'posts', '/', '32244', '/', 'edits', 'example']

我不想拆分 URL,我想得到这些块:

['This',' ', 'is', ' ',  'a', ' ', 'https://www.stackoverflow.com/posts/32244/edits', ' ', 'example', '.']

这就是我想为 URL 保持模式添加 p1 的原因。我上面用 p = p1 + p2 的描述可能不准确。

【问题讨论】:

  • 您在寻找|吗?如pat1|pat2,匹配一种或另一种模式。
  • @ggorlen 没有理由不能回答...
  • @ggorlen,是的。如何应用'|'分为以上两种模式?
  • @TimBiegeleisen 似乎太琐碎而无法回答。当然,这是一个骗局,或者不值得拥有。此外,我并不完全清楚 OP 希望根据问题进行交替而不是串联。 @marlon 将这两种模式替换为 pat1pat2
  • 当然,您首先需要更具体的模式,然后再退回到不太具体的模式。

标签: python python-re


【解决方案1】:

我认为拆分操作在这里不合适——通过说明您确实想要哪些子模式而不是在哪里分隔它们更容易积极地定义匹配。尽管规范有待推断,但您的组似乎是:

  1. 一个或多个空格 ( +)。
  2. 任何以 \bhttp 开头且不包含空格 (\bhttp[^ ]+) 的字符序列。
  3. 任何单词字符序列 (\b\w+)。
  4. 任何非单词、非空格字符(标点符号等)序列 (\b[\S\W]+)。

交替加入不同的可能性:

>>> re.findall(r" +|\bhttp[^ ]+|\b\w+|\b[\S\W]+", text)
['This', ' ', 'is', ' ', 'a', ' ', 'https://www.stackoverflow.com/posts/32244/edits', ' ', 'example', '.']

【讨论】:

  • 我会试试你的模式,但有理由尝试坚持原来的 p2 模式,因为这是针对非英文文本,但我使用上面的英文文本来说明这个想法。
  • 请询问您的实际规格。如果您过于琐碎化它,您可能会得到不准确的答案,因为我无法知道。你能发布一个小的、有代表性的实际文本的 sn-p 和相应的预期输出吗?
  • 您的回答很有帮助。我会弄清楚其余的。实际的很复杂,我想不出一个小而完整的例子。
  • 如果您可以将答案写为使用“|”,那么在我的情况下使用它可能更容易。
  • 我只想根据 p2 定义的这些分隔符进行拆分,如果是 URL,我不想拆分 URL 内的任何内容。这清楚吗? @ggorlen
猜你喜欢
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多