首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:使用Regex捕获模式中的子模式

Python:使用Regex捕获模式中的子模式
EN

Stack Overflow用户
提问于 2018-03-06 13:33:26
回答 4查看 277关注 0票数 3

免责声明:这是我的第一篇文章。请随意给我反馈,以及我应该如何或不应该格式化这个问题。谢谢!

我希望从文本块中提取数据,方法是捕获任何与日期格式后面跟着冒号的模式相匹配的内容。我已经成功地使用正则表达式来捕获信息,包括观察日期、冒号和后续到下一个日期之前的任何文本。

例如:

1999-01-01:观察到10只鸟类。

我遇到的问题是,在该观察日期之后的观察数据和第一个冒号中,我的一些数据包含了站点名和冒号。“sitename:data”的子模式可以在观察日期之后在块中发生0次或多次。

例如:

1999-01-01: BS-001: 5只观察到的鸟类。身体都很好。BS-002: 5只鸟观察到,有些鸟类健康状况不佳。

我应该使用什么模式来捕获日期格式和冒号之后的所有文本,包括潜在的站点名称、它们的冒号以及下一个观察日期之前的相关数据?

目前,我按日期提取简单的观测数据(其中没有多个站点),并使用以下模式进行观察:

代码语言:javascript
复制
pattern = re.compile(r'(\d\d\d\d\-*\s*\&*\d+\-*\d*:[A-Za-z0-9\s\,\(\)\;\"\-]*\.*)')  

上面的代码允许我提取各种形式的观察日期。使用句点作为模式的一部分是很棘手的,因为观察数据可以是一个或多个句子。

这里是一个例子,我试图搜索和分裂的文本。每一次新比赛都应以观察日期开始,因此在下面的数据中应返回3次匹配(2013-04-13:数据,2017-01-01:数据,2018-07-04:数据):

2013-04-13: BS-440:在春季池生境中观察到的10个卵群。观察者注意到,3个AMJE团块有牢固的果冻,类似于3周龄的AMMA团块,但在外面“更颠簸”(质量中的膜和胚胎间距是AMJE样的)。BS-443: 3春季池生境中观察到的卵团。由于光线条件差,一些卵团可能被忽略了。史密斯-019:250个卵团在春季池生境中观察到。观察者只搜索了与道路相邻的部分(水池的西南缘)。观察到的许多AMJE团附着在草本植被上,难以区分。AMJE蛋质量计数是搜索区域内的粗略估计。2017-01: 23人观察到。卵团未见。2018-07-04: BS-440:所有的个体都在长假周末休息。

理想情况下,输出应该如下所示:

2013-04-13: BS-440:在春季池生境中观察到的10个卵群。观察者注意到,3个AMJE团块有牢固的果冻,类似于3周龄的AMMA团块,但在外面“更颠簸”(质量中的膜和胚胎间距是AMJE样的)。BS-443: 3春季池生境中观察到的卵团。由于光线条件差,一些卵团可能被忽略了。史密斯-019:250个卵团在春季池生境中观察到。观察者只搜索了与道路相邻的部分(水池的西南缘)。观察到的许多AMJE团附着在草本植被上,难以区分。AMJE蛋质量计数是搜索区域内的粗略估计。 2017-01: 23人观察到。卵团未见。 2018-07-04: BS-440:所有的个体都在长假周末休息。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-03-06 13:52:06

基本上,听起来您想要将文本分割为以日期开头和在日期或文本结束之前结束的字段。这里有一种可能性:

代码语言:javascript
复制
\d{4}-\d\d-\d\d:           # date with colon
.*?                        # the minimal amount of any characters required to match
(?=                        # positive lookahead (match text but don't consume it)
   \d{4}-\d\d-\d\d:        # date with colon
  |                        # or
   $                       # end of text
)                          # end lookahead

将它与re.findall()结合使用

代码语言:javascript
复制
findall(r'\d{4}-\d\d-\d\d:.*?(?=\d{4}-\d\d-\d\d:|$)', mytext)

针对上面的示例文本运行:

代码语言:javascript
复制
['2013-04-13: BS-440: 10 egg masses observed in vernal pool habitat.
  Observer noted 3 of the AMJE masses had firm jelly, akin to a 3-wk
  old AMMA mass, but "bumpier" on outside (membrane and embryo-spacing
  in the masses were AMJE-like). BS-443: 3 egg masses observed in
  vernal pool habitat. A few egg masses may have been missed due to
  poor light conditions. Smith-019: 250 egg masses observed in
  vernal pool habitat. Observer searched only portions abutting the 
  road (SW margin of pool). Many AMJE masses observed attached
  to herbaceous vegetation and difficult to differentiate from
  one another. AMJE egg-mass count is a rough estimate within
  area searched. ',
 '2017-01-01: 23 individuals observed. Egg masses were not present. ',
 '2018-07-04: BS-440: All individuals took a break from breeding for
  the long holiday weekend.']
票数 2
EN

Stack Overflow用户

发布于 2018-03-06 13:49:00

您可以尝试用两个换行符替换所有空格,然后是日期:

代码语言:javascript
复制
s = re.sub(r'\s+(?=\d{4}-*\s*&*\d+-*\d*:)', "\n\n", s)

这样,您就无法匹配字符串开头的第一次约会。

如果您不确定每个日期前面都有空格,您也可以这样写:

代码语言:javascript
复制
s = re.sub(r'\s*(?!^)(?=\d{4}-*\s*&*\d+-*\d*:)', "\n\n", s)
票数 2
EN

Stack Overflow用户

发布于 2018-03-06 13:58:57

您可以使用split()和regex (?=\d{4}-\d{2}-\d{2})

代码语言:javascript
复制
output = re.compile(" (?=\d{4}-\d{2}-\d{2})").split(text)

代码演示

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49132092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档