re.split('\ n。+',content)输出意外的['','','','','','','\ n']

问题描述 投票:2回答:4

假设有如下文字

'\nModels: Introduction to models | Field types | Indexes | Meta options | Model class\nQuerySets: Making queries | QuerySet method reference | Lookup expressions\nModel instances: Instance methods | Accessing related objects\nMigrations: Introduction to Migrations | Operations reference | SchemaEditor | Writing migrations\nAdvanced: Managers | Raw SQL | Transactions | Aggregation | Search | Custom fields | Multiple databases | Custom lookups | Query Expressions | Conditional Expressions | Database Functions\nOther: Supported databases | Legacy databases | Providing initial data | Optimize database access | PostgreSQL specific features\n'

我想要达到的结果是

['Models: Introduction to models | Field types | Indexes | Meta options | Model class',
 'QuerySets: Making queries | QuerySet method reference | Lookup expressions',
 'Model instances: Instance methods | Accessing related objects',
 'Migrations: Introduction to Migrations | Operations reference | SchemaEditor | Writing migrations',
 'Advanced: Managers | Raw SQL | Transactions | Aggregation | Search | Custom fields | Multiple databases | Custom lookups | Query Expressions | Conditional Expressions | Database Functions',
 'Other: Supported databases | Legacy databases | Providing initial data | Optimize database access | PostgreSQL specific features',]

我的第一次尝试是:

In [61]: re.split('\n', content)
Out[61]:
['',
 'Models: Introduction to models | Field types | Indexes | Meta options | Model class',
 'QuerySets: Making queries | QuerySet method reference | Lookup expressions',
 'Model instances: Instance methods | Accessing related objects',
 'Migrations: Introduction to Migrations | Operations reference | SchemaEditor | Writing migrations',
 'Advanced: Managers | Raw SQL | Transactions | Aggregation | Search | Custom fields | Multiple databases | Custom lookups | Query Expressions | Conditional Expressions | Database Functions',
 'Other: Supported databases | Legacy databases | Providing initial data | Optimize database access | PostgreSQL specific features',
 '']

不过,当我尝试的时候

In [60]: re.split('\n.+',content)
Out[60]: ['', '', '', '', '', '', '\n']

输出超出了我的预期。我无法理解它。

6.2. re—Regular expression operations的例子中

re.split(r'\W+', 'Words, words, words.')
outputs ['Words', 'words', 'words', '']
not [',', ',', ',', ' ']
#why
re.split('\n.+',content)
outputs ['', '', '', '', '', '', '\n']
python regex
4个回答
0
投票

这很明显:\n.+匹配以换行符开头的任何内容,后跟任何类的一个或多个字符,但.将不匹配控制字符,如换行符。

所以一场比赛从\n开始,并在下一个\n之前结束一个角色。因此,split的分隔符都是可见的字符,这样的分割将产生空字符串,因为这些空字符串位于分隔符之间。

您的输入字符串以换行符开头和结尾,因此在使用\n拆分后的第一个和最后一个空字符串。将模式修改为

(?<!^)\n(?<!$)

不匹配前导和尾随换行符。这使用负面的lookbehind和lookahead来排除那些第一个和最后一个。

https://regex101.com/r/A2vIbu/1


0
投票

我想你可能会对文本中的正则表达式示例感到困惑。正则表达式中的\W+匹配一个或多个非单词字符。所以空格,标点符号等是匹配的。因此re.split返回一个单词列表。

为了您的示例,您只需要删除.*

EG

import re
content = '\nModels: Introduction to models | Field types | Indexes | Meta options | Model class\nQuerySets: Making queries | QuerySet method reference | Lookup expressions\nModel instances: Instance methods | Accessing related objects\nMigrations: Introduction to Migrations | Operations reference | SchemaEditor | Writing migrations\nAdvanced: Managers | Raw SQL | Transactions | Aggregation | Search | Custom fields | Multiple databases | Custom lookups | Query Expressions | Conditional Expressions | Database Functions\nOther: Supported databases | Legacy databases | Providing initial data | Optimize database access | PostgreSQL specific features\n'

re.split(r'\n',content)

['', 'Models: Introduction to models | Field types | Indexes | Meta options | Model class', 'QuerySets: Making queries | QuerySet method reference | Lookup expressions', 'Model instances: Instance methods | Accessing related objects', 'Migrations: Introduction to Migrations | Operations reference | SchemaEditor | Writing migrations', 'Advanced: Managers | Raw SQL | Transactions | Aggregation | Search | Custom fields | Multiple databases | Custom lookups | Query Expressions | Conditional Expressions | Database Functions', 'Other: Supported databases | Legacy databases | Providing initial data | Optimize database access | PostgreSQL specific features', '']

此外,如果你知道你将要开始和完成\n,你可以切掉空白:

re.split(r'\n',content)[1:-1]
['Models: Introduction to models | Field types | Indexes | Meta options | Model class', 'QuerySets: Making queries | QuerySet method reference | Lookup expressions', 'Model instances: Instance methods | Accessing related objects', 'Migrations: Introduction to Migrations | Operations reference | SchemaEditor | Writing migrations', 'Advanced: Managers | Raw SQL | Transactions | Aggregation | Search | Custom fields | Multiple databases | Custom lookups | Query Expressions | Conditional Expressions | Database Functions', 'Other: Supported databases | Legacy databases | Providing initial data | Optimize database access | PostgreSQL specific features']

0
投票

正如垃圾收集器所提到的,你的第一次尝试的问题是你的原始文本被\n包围,所以在分割的那一刻,你得到一个空字符串作为发出这个事实的第一个元素,同样是为了结束。

要解决这个问题,首先需要删除那些可以使用.strip方法轻松完成的方法:

>>> import re
>>> t = "\na a a\nb b b\nc c c\n"
>>> t.strip()
'a a a\nb b b\nc c c'
>>> re.split("\n",t.strip())
['a a a', 'b b b', 'c c c']
>>> 

也就是你所描述的这个任务你不需要re模块,str class有很多方法来处理各种常见情况,对于这个.splitlines方法也会这样做

>>> t.strip().splitlines()
['a a a', 'b b b', 'c c c']
>>> 

0
投票

鉴于:

>>> txt
'\nModels: Introduction to models | Field types | Indexes | Meta options | Model class\nQuerySets: Making queries | QuerySet method reference | Lookup expressions\nModel instances: Instance methods | Accessing related objects\nMigrations: Introduction to Migrations | Operations reference | SchemaEditor | Writing migrations\nAdvanced: Managers | Raw SQL | Transactions | Aggregation | Search | Custom fields | Multiple databases | Custom lookups | Query Expressions | Conditional Expressions | Database Functions\nOther: Supported databases | Legacy databases | Providing initial data | Optimize database access | PostgreSQL specific features\n'

你可以这样做(我把它格式化为你想要的例子......):

>>> [e for e in txt.split('\n') if e]
['Models: Introduction to models | Field types | Indexes | Meta options | Model class', 
 'QuerySets: Making queries | QuerySet method reference | Lookup expressions', 
 'Model instances: Instance methods | Accessing related objects', 'Migrations: Introduction to Migrations | Operations reference | SchemaEditor | Writing migrations', 
 'Advanced: Managers | Raw SQL | Transactions | Aggregation | Search | Custom fields | Multiple databases | Custom lookups | Query Expressions | Conditional Expressions | Database Functions', 
 'Other: Supported databases | Legacy databases | Providing initial data | Optimize database access | PostgreSQL specific features']

同样的方法也适用于re.split

>>> [e for e in re.split('\n+',txt) if e]
# same output...

或者,你可以捕获你想要的东西,然后分裂你不想要的东西。在这种情况下,使用look-behind查找\n之后的文本:

>>> re.findall(r'(?<=\n)([^\n]+)', txt)
# same output
© www.soinside.com 2019 - 2024. All rights reserved.