【问题标题】:Regex - capture text between matches, and if no match, capture all正则表达式 - 捕获匹配之间的文本,如果不匹配,则捕获所有
【发布时间】:2017-07-18 21:07:16
【问题描述】:

我对正则表达式很陌生,我正在尝试捕获两个字符串之间的文本。但如果字符串不存在,我想捕获所有文本。

这是一个例子:

报告 #1:观察结果:一只猫在伸展。结论:这只猫很灵活。

我可以使用以下代码来捕获“观察”和“结论”之间的文本:

(?:(?i)observations)(.*)(?:(?i)conclusions)

但如果另一个文字写着:

报告 #1:观察结果:一只猫在伸展。这只猫很灵活。

我想在“Observations”之后捕获所有内容。

或者如果起始字符串“Observations”不存在:

报告 #1:一只猫在伸展。结论:这只猫很灵活。

我想从头到尾捕获字符串“结论”。

我猜条件正则表达式可能会有所帮助?

谢谢!

【问题讨论】:

  • 你在 R 中工作吗?
  • 你可以试试regex101.com/r/RdMnFA/1
  • @WiktorStribizew 是的,我是。哇谢谢你!它看起来很整洁。我想条件必须这么长才能起作用?

标签: r regex


【解决方案1】:

单行:

ex <- c(
  "Report #1: Observations: A cat is stretching. Conclusions: This cat is flexible.",
  "Report #1: Observations: A cat is stretching. This cat is flexible.",
  "Report #1: A cat is stretching. Conclusions: This cat is flexible."
)

gsub("(^.*observations|conclusions.*$)", "", ex, ignore.case = TRUE)
# [1] ": A cat is stretching. "                     
# [2] ": A cat is stretching. This cat is flexible."
# [3] "Report #1: A cat is stretching. "            

您可能需要边界或 G5W 建议的单词之前/之后的空格。单词边界看起来像这样,给定示例文本的输出相同:

gsub("(^.*\\bobservations\\b|\\bconclusions\\b.*$)", "", ex, ignore.case = TRUE)

【讨论】:

  • 谢谢!这是完美的!
【解决方案2】:

一种方法是使用两个正则表达式:

reports = c(
"Report #1: Observations: A cat is stretching. Conclusions: This cat is flexible.", 
"Report #1: Observations: A cat is stretching. This cat is flexible.")

reports = sub(".*Observations:\\s*", "", reports)
reports = sub("\\s*Conclusions:.*", "", reports)

reports
[1] "A cat is stretching."                      
[2] "A cat is stretching. This cat is flexible."

【讨论】:

  • 对空白的期望有什么理由吗?我不认为这是一个要求。
  • 示例数据中有空格。
  • 是但不在解析的要求中。我不认为这在上下文中是不正确的,但是 OP 没有引用空格。我认为也许更好的期望是边界\\b。
  • 我对所需输出的解释。我承认这不是字面上的“观察后的一切”:
猜你喜欢
  • 2021-12-24
  • 2015-08-05
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
相关资源
最近更新 更多