python正则表达式返回错误的结果

时间:2018-01-31 05:35:26

标签: python regex

以下是我的代码:

import re
str = "?CNTN_CD=A0002400127&PAGE_CD=ET00_1&BLCK_NO=1&CMPT_CD=T0016&TEXT=한글패러미터"
pattern = re.compile("[a-zA-Z0-9?=&\-_]+")
result = pattern.search(str)
print(result)

结果如下:

<_sre.SRE_Match object; span=(0, 65), match='?CNTN_CD=A0002400127&PAGE_CD=ET00_1&BLCK_NO=1&CMP>

但我期待这个结果:

<_sre.SRE_Match object; span=(0, 65), match='?CNTN_CD=A0002400127&PAGE_CD=ET00_1&BLCK_NO=1&CMPT_CD=T0016&TEXT=>

我无法找到该结果的原因。请给我建议。

非常感谢你。

3 个答案:

答案 0 :(得分:0)

你可以用这个:

[\u0000-\u007F]+

Demo

示例来源:(run here

import re
str = "?CNTN_CD=A0002400127&PAGE_CD=ET00_1&BLCK_NO=1&CMPT_CD=T0016&TEXT=한글패러미터"
pattern = re.compile(r"[\u0000-\u007F]+")
result = pattern.search(str)
print(result.group(0))

答案 1 :(得分:0)

>>> 
>>> import re
>>> str3 = "?CNTN_CD=A0002400127&PAGE_CD=ET00_1&BLCK_NO=1&CMPT_CD=T0016&TEXT=한글패러미터"
>>> pattern = re.compile("[a-zA-Z0-9?=&\-_]+")
>>> result = pattern.search(str3)
>>> print(result.group(0))
?CNTN_CD=A0002400127&PAGE_CD=ET00_1&BLCK_NO=1&CMPT_CD=T0016&TEXT=
>>> 

我测试你的代码,它按预期工作,我的python是v2.7

答案 2 :(得分:0)

您正在打印_sre.SRE_Match的字符串表示形式,但不保证打印所有匹配的字符。我查看了CPython源代码并找到了以下implementation

static PyObject *
match_repr(MatchObject *self)
{
    PyObject *result;
    PyObject *group0 = match_getslice_by_index(self, 0, Py_None);
    if (group0 == NULL)
        return NULL;
    result = PyUnicode_FromFormat(
            "<%s object; span=(%d, %d), match=%.50R>",
            Py_TYPE(self)->tp_name,
            self->mark[0], self->mark[1], group0);
    Py_DECREF(group0);
    return result;
}

如您所见,它只输出该组的50个第一个字符。

您可以使用以下正则表单进行检查:

In [52]: print(re.compile('.*').search('a' * 48))
<_sre.SRE_Match object; span=(0, 48), match='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>

In [53]: print(re.compile('.*').search('a' * 49))
<_sre.SRE_Match object; span=(0, 49), match='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>

In [54]: print(re.compile('.*').search('a' * 50))
<_sre.SRE_Match object; span=(0, 50), match='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>

如您所见,match总是小于或等于50个字符。

要获取实际匹配的字符串,您可以使用group方法:

In [55]: print(re.compile('.*').search('a' * 50).group(0))
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

In [56]: print(len(re.compile('.*').search('a' * 50).group(0)))
50