如果前面有月份 python,则不获取数字

Don't get number if precede by month python

我正在使用 Jupyter 笔记本中的 python 从网络中提取一些数据。我已经下载了数据、解析并创建了数据框。我从数据框中变量中的字符串中提取了一个数字。我利用这个正则表达式来做到这一点:

number = []
for note in df["person_notes"]:
    match = re.search(r'\d+', note)
    if match:
        number.append(note[match.start(): match.end()])
    else:
        number.append("")

df["number"] = number

有些字符串缺少我要查找的数字。对于那些情况,我想number.append("")。这些字符串有一个完整的日期,就像这样...... "September 20, 2016" 而我的 re.search() 正在从那个完整的日期中提取数字 20。如果字符串有这样的数据,我想忽略 20 而不是 number.append("")

如果数字前面有一个月,我如何修改 re.search() 以忽略该数字?

我建议使用旧的 JS 正则表达式技巧:用 可选的捕获组 将你要用负向后视封闭的模式括起来,如果成功,则丢弃匹配项 (在这里,附加一个 "")。否则,获取其他捕获组内容(此处为数字)。

参见Python demo

import re
number = []
p = re.compile(r'((?:Jan|Febr)(?:uary)?|Ma(?:y|r(?:ch)?)|A(?:ug(?:ust)?|pr(?:il)?)|Ju(?:ne?|ly?)|Oct(?:ober)?|(?:Sept|Nov|Dec)(?:ember)?)? *(\d+)')
match = p.search('September 20, 2016')
if match and not match.group(1):         # Did the string match and did Group 1 fail?
    number.append(match.group(2))        # Yes, then add digits
else:
    number.append("")                    # Else, add an empty value
print(number)

如果您不关心缩短的月份名称并保持其可读性,您可以使用更简单的正则表达式:

p = re.compile(r'(January|February|March|April|May|June|July|August|September‌​|October|November|De‌​cember)? *(\d+)')

正则表达式匹配:

  • ((?:Jan|Febr)(?:uary)?|Ma(?:y|r(?:ch)?)|A(?:ug(?:ust)?|pr(?:il)?)|Ju(?:ne?|ly?)|Oct(?:ober)?|(?:Sept|Nov|Dec)(?:ember)?)? - 月份(全名或简称)
  • * - 零个或多个空格
  • (\d+) - 第 2 组:一个或多个数字。