假设有如下文字
'\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']
这很明显:\n.+
匹配以换行符开头的任何内容,后跟任何类的一个或多个字符,但.
将不匹配控制字符,如换行符。
所以一场比赛从\n
开始,并在下一个\n
之前结束一个角色。因此,split的分隔符都是可见的字符,这样的分割将产生空字符串,因为这些空字符串位于分隔符之间。
您的输入字符串以换行符开头和结尾,因此在使用\n
拆分后的第一个和最后一个空字符串。将模式修改为
(?<!^)\n(?<!$)
不匹配前导和尾随换行符。这使用负面的lookbehind和lookahead来排除那些第一个和最后一个。
我想你可能会对文本中的正则表达式示例感到困惑。正则表达式中的\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']
正如垃圾收集器所提到的,你的第一次尝试的问题是你的原始文本被\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']
>>>
鉴于:
>>> 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