擅长:python、mysql、java
<p>你可以用</p>
<pre><code>df['text'] = df.apply(lambda x: re.sub(r'(?<!\d)(?<!\d\.)(?:{}|{})(?!\.?\d)'.format(re.escape(x['num']), '|'.join([re.escape(l) for l in x['num'].split('/')])), '', x['text']), axis=1)
</code></pre>
<p>多亏了<code>df.apply</code>和<code>axis=1</code>,我们迭代了所有行</p>
<p>正则表达式根据<code>num</code>列中的值动态生成,并应用于<code>text</code>列</p>
<p><code>r'(?<!\d)(?<!\d\.)(?:{}|{})(?!\.?\d)'.format(re.escape(x['num']), '|'.join([re.escape(l) for l in x['num'].split('/')]))</code>创建类似正则表达式的</p>
<pre><code>(?<!\d)(?<!\d\.)(?:3/4|3|4)(?!\.?\d)
</code></pre>
<p>分别匹配<code>num</code>列中的完整值和<code>/</code>之间的数字</p>
<p><code>(?<!\d)(?<!\d\.)</code>是一个查找序列,如果当前位置的左侧有一个数字或一个数字+点,则匹配失败;如果当前位置的右侧有一个数字或一个数字+点,则<code>(?!\.?\d)</code>匹配失败,实际上不允许长数字中的数字匹配</p>