Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python regexp:splitvsv列_Python_Regex - Fatal编程技术网

Python regexp:splitvsv列

Python regexp:splitvsv列,python,regex,Python,Regex,数据如 230030215840▒Cumul Arte▒pl▒PROGRAMME_WEB▒SCI_nauka▒075631-005-A▒TV▒1 230030215840▒Cumul Arte▒pl▒PROGRAMME_WEB▒SCI_nauka▒075631-006-A▒TV▒1 我想把075631-006-A分成 ...▒075631-006-A▒075631-006▒A▒... 这意味着添加两列。 我的想法是首先检查是否存在这样的字符串 searchObj=re.search("(\d

数据如

230030215840▒Cumul Arte▒pl▒PROGRAMME_WEB▒SCI_nauka▒075631-005-A▒TV▒1
230030215840▒Cumul Arte▒pl▒PROGRAMME_WEB▒SCI_nauka▒075631-006-A▒TV▒1
我想把075631-006-A分成

...▒075631-006-A▒075631-006▒A▒...
这意味着添加两列。 我的想法是首先检查是否存在这样的字符串

searchObj=re.search("(\d{6}-\d{3})-([A-Z])",data,flags=0)
    if searchObj>0: #On trouve un EM
然后使用searchObj.groups做一个sub,但我做不到,这里有一种方法:

>>> data='230030215840▒Cumul Arte▒pl▒PROGRAMME_WEB▒SCI_nauka▒075631-005-A▒TV▒1'
>>> import re
>>> searchObj = re.search("(\d{6}-\d{3})-([A-Z])",data,flags=0)
>>> data.replace(searchObj.expand('\\1-\\2'), searchObj.expand('\\1▒\\2'))
'230030215840▒Cumul Arte▒pl▒PROGRAMME_WEB▒SCI_nauka▒075631-005▒A▒TV▒1'

说明了如何使用它来利用匹配的组。

使用嵌套组:用另一个paren组包装整个子字符串,将其更像是“原子”的东西,并保留最初用于匹配零件的paren组:

>>> s = '230030215840▒Cumul Arte▒pl▒PROGRAMME_WEB▒SCI_nauka▒075631-006-A▒TV▒1'
>>> re.search(r'((\d{6}-\d{3})-([A-Z]))', s).groups()
('075631-006-A', '075631-006', 'A')
>>> re.search(r'((\d{6}-\d{3})-([A-Z]))', s).groups()[1:]
('075631-006', 'A')
这样,如果整个类似
075631-006-A
的子字符串不存在,则MatchObject将为None,从而引发错误:

>>> re.search(r'((\d{6}-\d{3})-([A-Z]))', '075631-006-__BAD__').groups()[1:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
希望这有帮助

编辑
另一种变体是使用非捕获帕伦组。根据您的口味,它可以增加或减少清晰度-不需要切片
[1://code>,但同时您可以使用这个时髦的
(?:…)


第一个v代表什么?因为它是一个带分隔符的字符串,所以可能更安全的做法是先拆分,然后修改必填字段并将字符串重新组合,请参见。如果只有一个paren组存在,这种方法对于无效输入的行为是错误的-它应该是错误的(searchObj==None),而不是无效的
data.replace()
。这并不奇怪,不是吗?如果用户拥有无效数据,而他不知道这一点,这对用户来说是令人惊讶的-非常真实的情况。假设OP的一个输入行的格式被破坏。。提供因无效输入而失败的代码比提供误报的代码要好,不是吗?健壮性是一件好事
rx = re.compile(r'((\d{6}-\d{3})-([A-Z]))')
match = rx.search(input)
if match:
   # all 3 groups are present here
   part1, part2 = match.groups()[1:]
rx = re.compile(r'(?:(\d{6}-\d{3})-([A-Z]))')
match = rx.search(input)
if match:
   part1, part2 = match.groups()