Python 重新 search/match “|”问题

Python re search/match "|" issue

在 Perl 时代,我是一个正则表达式怪胎。我肯定很难适应重新。为了简化大数据集,我需要搜索“|”字符,唯一可行的组合是 re.escape'|'re.search 而不是 re.match

import re

x = re.compile((re.escape'|'))
cohort = ['virus_1', 'virus_2|virus_3']

for isolate in cohort:
#   note that re.escape(isolate) fails
    if x.search(isolate):
        print(isolate)

输出

virus_2|virus_3

好的,上面的组合有效,但 re.match 无效。另外,为什么我需要 re.escape('|') 以及为什么 re.escape(isolate),即列表元素失败?我经常使用 re 缺少什么?

因此,有两点可能与 perl 不同: "re.match" in Python 必须匹配以 -
开头的字符串 那就是:你必须创建一个从一开始就匹配的正则表达式 上的字符串。在字符串中的任意位置查找模式 您可以使用 re.searchre.findall.

另一件事确实与转义有关: Python 解析器使用的 \ 字符, 编译代码前,指明特殊控制字符 传递给 re 调用的纯字符串中可能会出现问题。 所以 Python 有一种特殊形式的字符串,其中引号是前缀 使用 r,如 r"regexp_here",解析器不会触及 \ 字符并创建一个始终包含的字符串对象 文字 \ 字符。这个字符串适合传递 作为各种 re 函数的参数。 然后,您只需在内部通常使用 \ 转义 | r 标记的字符串:

In [164]: cohort = ['virus_1', 'virus_2|virus_3']                                                                                    

In [165]: [string for string in cohort if re.search(r"\|", string)]                                                                  
Out[165]: ['virus_2|virus_3']

In [166]: [string for string in cohort if re.match(r"^.*?\|", string)]                                                               
Out[166]: ['virus_2|virus_3']

In [167]: [string for string in cohort if re.match(r"\|", string)]                                                                   
Out[167]: []