Python字符串匹配,错误:在位置0处没有要重复的内容

Python字符串匹配,错误:在位置0处没有要重复的内容,python,regex,string,matching,Python,Regex,String,Matching,我在Python astropy表中有一个名为'cc_flags'的列。它看起来像:: cc_旗 如果是'0',即'***0'或'???'0'匹配器,我想拉出最后一个字符为四的每一行 我得到一份工作 error: nothing to repeat at position 0 与 我做错了什么 ?在正则表达式中不表示“任何字符”。将?s替换为s?在正则表达式中并不表示“任何字符”。将?s替换为s如果您不局限于正则表达式或类似正则表达式,这很简单: has_zeros = [line for l

我在Python astropy表中有一个名为'cc_flags'的列。它看起来像::

cc_旗 如果是'0',即'***0'或'???'0'匹配器,我想拉出最后一个字符为四的每一行

我得到一份工作

error: nothing to repeat at position 0


我做错了什么

在正则表达式中不表示“任何字符”。将
s替换为
s

在正则表达式中并不表示“任何字符”。将
s替换为
s

如果您不局限于正则表达式或类似正则表达式,这很简单:

has_zeros = [line for line in data['cc_flags'] if line[-1] == '0']
此列表理解将把
数据['cc_flags']
中的每个元素提取到一个名为line的变量中,并返回一个结果列表,该列表仅由行的最后一个字符0组成


(显然,如果您需要更具体的if语句,可以在筛选条件中添加任何其他需要的内容。)

如果您不局限于regex或类似regex,这很简单:

has_zeros = [line for line in data['cc_flags'] if line[-1] == '0']
此列表理解将把
数据['cc_flags']
中的每个元素提取到一个名为line的变量中,并返回一个结果列表,该列表仅由行的最后一个字符0组成


(显然,如果您需要更具体的if语句,可以在筛选条件中添加任何其他需要的内容。)

正如其他人所说,您需要使用
而不是
。另一种方法是使用
{}
指定匹配的数量

例如,尝试以下方法:

import re
regex = r".{3}0"
re.findall(regex,data['cc_flags'])
  • 表示匹配任何字符(行终止符除外)
  • {3}
    表示精确匹配3次

正如其他人所说,您需要使用
而不是
。另一种方法是使用
{}
指定匹配的数量

例如,尝试以下方法:

import re
regex = r".{3}0"
re.findall(regex,data['cc_flags'])
  • 表示匹配任何字符(行终止符除外)
  • {3}
    表示精确匹配3次

问题在于正则表达式没有转义搜索词中的特殊字符。要实现这一点,只需将您的声明更改为以下内容:

重新导入
正则表达式=重新转义(“???0”)
关于findall(正则表达式,数据['cc_flags']))

数据['cc_flags']
应该是字符串,而不是列表。

问题在于正则表达式没有转义搜索词中的特殊字符。要实现这一点,只需将您的声明更改为以下内容:

重新导入
正则表达式=重新转义(“???0”)
关于findall(正则表达式,数据['cc_flags']))


data['cc_flags']
应该是字符串,而不是列表。

必须使用正则表达式吗?您使用的是通配符匹配,而不是正则表达式。考虑使用或更改正则表达式到<代码> 0 你必须使用正则表达式吗?你正在使用通配符匹配而不是正则表达式。考虑使用或更改正则表达式到<代码> 0…<代码> ReGeX =“…0”Re.FiDALL(ReGEX,数据[CcIfLangs]),然后给我一个“Type Error:不能在一个类似对象的字节上使用一个字符串模式”@npross
regex=rb'…0'
?@npross您使用的astropy数据结构是“类似字节的对象”。正如莴苣先生提到的,将
b
标志添加到您的正则表达式将允许它匹配.regex=“…0”re.findall(regex,data['cc_flags']),然后给我一个“TypeError:无法在类似字节的对象上使用字符串模式”@npross
regex=rb'…0'
?@npross您使用的astropy数据结构是“类似字节的对象”。正如莴苣先生所提到的,将
b
标志添加到正则表达式将允许它匹配。(同时)给了我一个类型错误:不能在像这样的字节上使用字符串模式object@npross
regex=rb'{3}0'
?这不会崩溃,但会给我::[b'\x00\x00\x000',b'\x00\x00\x000',b'\x00\x00\x000',b'\x00\x000',也给了我一个类型错误:不能在类似object@npross
regex=rb'{3}0'
?这不会崩溃,但会给我::[b'\x00\x00\x000',b'\x00\x00\x000',b'\x00\x00\x000',b'\x00\x00\x000',您也可以使用。@delerious莴苣绝对可以,虽然我希望line[-1]比line.endswith()更有效。当然,可能是这样,但数组访问也是如此。至少在我的系统中,[-1]在这种情况下更有效:
$python-m timeit'如果“1230”[-1]=“0”:通过“
100000000个循环,每个循环最好使用3:0.0177个usec
$python-m timeit”如果“1230”。endswith(“0”):通过“
10000000个循环,每个循环最好使用3:0.0709个usec,但我们在杂草中迷失了方向。我只是想提出一个非正则解决方案。根据您的需要,[-1]或.endswith都可以工作。(两者都比正则表达式有效得多。:-)我有点想让正则表达式解决方案用于一般学习,但这确实有效,并且最终达到了我想要的效果!!谢谢。您也可以使用。@delerious莴苣绝对有效,尽管我希望line[-1]比line.endswith()更有效。当然,可能是这样,但数组访问也是如此。至少在我的系统上,[-1]在这种情况下效率更高:
$python-m timeit'如果“1230”[-1]==“0”:通过“
100000000个循环,最好是每个循环3:0.0177 usec
$python-m timeit”如果“1230”。endswith(“0”):pass'
10000000个循环,每个循环最好3:0.0709 usec,但我们在杂草中迷失了方向。我只是想提出一个非正则表达式解决方案。根据您的需要,[-1]或.endswith都可以工作。(两者都比正则表达式更有效。:-))我有点想用正则表达式解决一般学习问题,但这确实有效,而且最终达到了我的目的!!谢谢。