我想从数据框中提取以下模式:
Mar 20th, 2009; Mar 21st, 2009; Mar 22nd, 2009
我写了下面的代码来提取它:
d4=df.str.extractall(r'((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z][?:]*)((?:\d{1,2}(?:th|st|nd|rd)[,?:])\d{4})')
不幸的是,它无法提取任何内容。
答案 0 :(得分:2)
我假设你的日期格式只有:MMM DDst / nd / rd / th,YYYY,因此2009年3月1日而不是2009年3月1日。以下正则表达式应该运行良好。
\b(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (?:[0-3][1]st|[0-2][2]nd|[0-2][3]rd|[1-3][0]th|[0-2][4-9]th), \d{4}
答案 1 :(得分:1)
我看到你的模式存在多个问题/疑问,所以我从一开始就改写它:
(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{1,2}(?:th|st|nd|rd),\s+\d{4}
以下是对模式的解释:
(?:Jan|Feb|...|Dec) match, but do not capture, the abbreviated month name
\s+ one or more spaces
\d{1,2} day as one or two digits
(?:th|st|nd|rd) match, but do not capture, day quantifier
\s+ one or more spaces
\d{4} match a four digit year
完整代码:
my_str = 'Mar 20th, 2009; Mar 21st, 2009; Mar 22nd, 2009'
match = re.findall(r'(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{1,2}(?:th|st|nd|rd),\s+\d{4}', my_str)
for item in match:
print(item)
答案 2 :(得分:0)
它需要一些空格。
((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\s+((?:\d{1,2}(?:th|st|nd|rd)[,?:])\s+\d{4})
( # (1 start)
(?:
Jan
| Feb
| Mar
| Apr
| May
| Jun
| Jul
| Aug
| Sep
| Oct
| Nov
| Dec
)
) # (1 end)
\s+
( # (2 start)
(?:
\d{1,2}
(?: th | st | nd | rd )
[,?:]
)
\s+
\d{4}
) # (2 end)
答案 3 :(得分:0)