如何编写 if-then-else 正则表达式?

How to write if-then-else regex?

以下代码是用于从数据帧中查找子字符串的正则表达式。

如何修改正则表达式如下:

if x[0] is an English letter, that is, [a-zA-Z], then keep the first `\b`, else remove it
AND
if x[-1] is an English letter, that is, [a-zA-Z], then keep the last `\b`, else remove it

for k, v in keyword.items():
        pat = '|'.join(r"\b{}\b".format(x) for x in v)
        df[str(k)] = df['string'].str.contains(pat).astype(int)

String = 'BEAUTY Company is good, 歡迎~~YOU, SALE'
BEA: not match
Com: not match
歡迎: match
SALE: match

谢谢。

你可以这样做

 import re

 if (re.search(r'[a-zA-Z]',x[0]):
    print(x[0])
 else:
    x = x[1:]

 if(re.search(r'[a-zA-Z]',x[-1]):
    print(x[-1])
 else:
    x = x[:-1]

您可以使用

pat = r'(?!(?<=[A-Za-z])[A-Za-z])(?:{})(?<![A-Za-z](?=[A-Za-z]))'.format("|".join([re.escape(x) for x in v]))

参见online regex demo

这里主要是环顾四周,(?!(?<=[A-Za-z])[A-Za-z])(?<![A-Za-z](?=[A-Za-z]))

如果当前位置(即关键字的第一个字符)的右侧是一个前面有另一个 ASCII 字母的 ASCII 字母 (检查了正后视 (?<=[A-Za-z])).

(?<![A-Za-z](?=[A-Za-z])) 是一个否定后视,如果当前位置的左侧(即关键字的最后一个字符)是一个 ASCII 字母,后面跟着另一个 ASCII 字母(检查正向前瞻 (?=[A-Za-z])).

请注意,您不必将这些外观添加到正则表达式中的每个替代项,只需使用它们来包围一个 (?:...|...) 样的替代组,您可以像我上面显示的那样动态构建它。

此外,如果任何关键字可以包含应被视为文字字符的特殊正则表达式字符,[re.escape(x) for x in v] 会很方便。

Python demo:

import re
s = 'BEAUTY Company is good, 歡迎~~YOU, SALE'
v = ['BEA','Com','歡迎','SALE']
pat = r'(?!(?<=[A-Za-z])[A-Za-z])(?:{})(?<![A-Za-z](?=[A-Za-z]))'.format("|".join([re.escape(x) for x in v]))
print(re.findall(pat, s)) # =>  ['歡迎', 'SALE']