Python regexp:拆分vsv列

2024-09-25 10:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

数据如下

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,但是我做不到


Tags: 数据字符串rewebsearchdatatvflags
2条回答

使用嵌套组:用另一个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'

然后,更完整的解决方案如下所示:

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:]

希望这有帮助

编辑 另一种变体是使用非捕获paren组。根据你的口味,它增加或减少清晰度-切片[1:]是不需要的,但同时你使用这个时髦的(?:....)regexp syntax

rx = re.compile(r'(?:(\d{6}-\d{3})-([A-Z]))')
match = rx.search(input)
if match:
   part1, part2 = match.groups()

有一种方法:

>>> 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'

expand documentation解释了如何使用它来利用匹配的组

相关问题 更多 >