如何用更简洁的正则表达式提取文本中的特定关键词串?
优化正则表达式提取指定模式字符串
需求回顾
从文本中提取以Key word(s):开头,后续由空格或/分隔、包含字母/数字组合的目标内容,示例涵盖多元素组合、数字与文本混合等场景。
原正则的问题
你编写的正则存在重复冗余(多次重复前缀匹配)、匹配范围有限(仅覆盖少量元素组合)的问题,无法完整覆盖所有目标场景。
优化方案
方案1:精准匹配到换行边界(推荐)
利用正向预查限定提取范围,同时兼容前缀后的空白,正则简洁且覆盖所有场景:
library(stringr) # 定义优化后的正则模式 pattern <- "Key word\\(s\\):\\s*(.*?)(?=\\n{2}|$)" # 提取目标内容 extracted <- str_extract(data_example, pattern)
方案2:严格匹配允许的字符(字母/数字/空格//)
如果需要严格限定目标内容仅包含指定字符,可调整正则为:
pattern <- "Key word\\(s\\):\\s*([A-Za-z0-9\\s/]+)(?=\\n{2}|$)"
正则解释
Key word\\(s\\)::精准匹配前缀,括号用\\转义(正则中括号为特殊字符)\\s*:匹配前缀后任意数量的空白(兼容多空格或制表符)(.*?)/([A-Za-z0-9\\s/]+):非贪婪匹配目标内容(前者匹配任意字符,后者严格限定允许的字符集)(?=\\n{2}|$):正向预查,匹配到连续两个换行符或字符串结尾,确保只提取Key word(s):后到下一段之前的内容
测试结果
运行上述代码后,对data_example的提取结果为:
[1] "Key word(s): Forecast/Development of Sales" [2] "Key word(s): 9 Month figures" [3] "Key word(s): Capital Increase" [4] "Key word(s): Contract/Incoming Orders"
如果只需提取冒号后的内容(不含前缀),可使用正向后顾调整正则:
pattern <- "(?<=Key word\\(s\\):\\s*).*?(?=\\n{2}|$)"
内容的提问来源于stack exchange,提问作者Philipp Neuber
相关产品推荐
相关产品推荐

