如果前面有月份 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|December)? *(\d+)')
正则表达式匹配:
((?:Jan|Febr)(?:uary)?|Ma(?:y|r(?:ch)?)|A(?:ug(?:ust)?|pr(?:il)?)|Ju(?:ne?|ly?)|Oct(?:ober)?|(?:Sept|Nov|Dec)(?:ember)?)?
- 月份(全名或简称)
*
- 零个或多个空格
(\d+)
- 第 2 组:一个或多个数字。
我正在使用 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|December)? *(\d+)')
正则表达式匹配:
((?:Jan|Febr)(?:uary)?|Ma(?:y|r(?:ch)?)|A(?:ug(?:ust)?|pr(?:il)?)|Ju(?:ne?|ly?)|Oct(?:ober)?|(?:Sept|Nov|Dec)(?:ember)?)?
- 月份(全名或简称)*
- 零个或多个空格(\d+)
- 第 2 组:一个或多个数字。