我有一个数据框架,里面有一堆列,其中一个是这样的:
data = {'Product': ['Product A', 'Product B', 'Product C (discontinued in March 2021)', 'Product D', 'Product E (discontinued on 30 April 2004)']}
df = pd.DataFrame(data)
字符串
我试着写一段代码,遍历列的每一行,在括号中标识年份(如果适用),并将括号内的文本替换为下面的'discont. '
+ the year identified
。因此,对于'Product C'
,它应该将其更改为Product C (discont. 2021)
。
def amend_vals(value):
pattern = r'\((\d{4})\)' # Regex pattern to capture the year inside brackets
match = re.search(pattern, value)
if match:
year = match.group(1)
return re.sub(pattern, '(discont. ' + year + ')', value)
else:
return value
df['Product'] = df['Product'].apply(amend_vals)
型
但似乎不起作用。有人知道怎么修吗?
4条答案
按热度按时间mpgws1up1#
使用以下正则表达式替换:
个字符
bqujaahr2#
使用正则表达式和lookarounds:
字符串
输出量:
型
regex demo
型
hyrbngr73#
更改regexp,以同时捕获括号内的整个片段和括号内的年份。在文本替代中使用的年份和整个作品替换为您的新文本。
字符串
输出量:
型
bzzcjhmw4#
这两个问题是:
1.你的正则表达式不匹配任何字符串,并且
1.你没有导入你的库(可能你只是忘记包含它,但也可能没有!)
正则表达式
正则表达式是
r'\((\d{4})\)
。这与两边由括号包围的四位数字匹配。这意味着它将匹配(2023)
,但不会匹配(discontinued 2023)
或括号内的任何其他数字,其中有其他数字在数字中。显而易见的答案是修改它,以便在数字之前(或者之后,如果你愿意)的括号内可以有任何内容。模式
r'\(.*(\d{4}).*\)'
可以做到这一点。库
您要导入re和pandas。
工作代码
下面是经过上述修改的代码:
字符串