-1

这是模式

pattern_strings = ['\\xc2d', '\\xa0', '\\xe7', '\\xc3\\ufffdd', '\\xc2\\xa0', '\\xc3\\xa7', '\\xa0\\xa0', '\\xc2', '\\xe9']
join_pattern =  '[' + '|'.join(pattern_strings) + ']'
pattern = re.compile(join_pattern)

这是功能

def find_pattern(path):
    with open(path, 'r') as f:
        for line in f:
            # print line
            found = pattern.search(line)
            if found:
                print dir(found)
                logging.info('found in line - ' + line)
                logging.info('found - ' + str(found.group(0)))

这是输入

\xc2d 
d\xa0 
\xe7 
\xc3\ufffdd 
\xc3\ufffdd 
\xc2\xa0 
\xc3\xa7 
\xa0\xa0 
'619d813\xa03697' 

当我运行它时,我得到的输出为

INFO:root:found in line - \xc2d 

INFO:root:found - d
INFO:root:found in line - d\xa0 

INFO:root:found - d
INFO:root:found in line - \xc3\ufffdd 

INFO:root:found - u
INFO:root:found in line - \xc3\ufffdd 

INFO:root:found - u
INFO:root:found in line - '619d813\xa03697' 

INFO:root:found - d

问题 - 为什么它不告诉整个模式\xc2d?我在这里做错了什么吗?- 我需要做什么才能让模式匹配\xc2d而不是d

更新

chaging tojoin_pattern = '(' + '|'.join(pattern_strings) + ')'不匹配任何东西

更新 1

pattern_strings = ['\\xc2d', '\\xa0', '\\xe7', '\\xc3\\ufffdd', '\\xc2\\xa0', '\\xc3\\xa7', '\\xa0\\xa0', '\\xc2', '\\xe9']

join_pattern =   '|'.join(pattern_strings)
pattern = re.compile(join_pattern)

这与输入中的任何内容都不匹配:(

4

2 回答 2

1

中的方括号re表示一个集合

join_pattern = '[' + '|'.join(pattern_strings) + ']'导致正则表达式匹配“中的任何一个字符集{ \ x c 2 d a 0 e 7 3 u f 9 | }”。这可能不是您想要的行为。对于您只想使用的表达式:

join_pattern = '|'.join(pattern_strings)

不需要括号,除非您尝试指定捕获/非捕获组。

于 2012-07-27T19:46:54.153 回答
0

问题是您用方括号将正则表达式括起来,[]. 这些表示一组字符;也就是说,[abc|def]将匹配a, b, c, |, d, e, 或之一f。使用您拥有的正则表达式,不需要括号。如果这是更大表达式的一部分,您可以使用圆括号()来表示一个组,该组确实将正则表达式的一部分组合在一起。(它也是一个捕获组,因此可以使用 . 访问其内容.group(1)。)

于 2012-07-27T19:43:51.870 回答