带有正则表达式的Python分区字符串

时间:2015-09-26 10:59:39

标签: python regex partition

我正在尝试使用Python的分区和正则表达式来清理文本字符串。例如:

testString = 'Tre Bröders Väg 6 2tr'
sep = '[0-9]tr'
head,sep,tail = testString.partition(sep)
head
>>>'Tre Br\xc3\xb6ders V\xc3\xa4g 6 2tr'

头部仍然包含我要删除的 2tr 。我对正则表达式不是那么好,但不应该[0-9]做这个伎俩吗?

我希望这个例子的输出是

head
>>> 'Tre Br\xc3\xb6ders V\xc3\xa4g 6

3 个答案:

答案 0 :(得分:2)

str.partition不支持正则表达式,因此当你给它一个类似 - '[0-9]tr'的字符串时,它会尝试在testString中找到基于的head中的确切字符串,它是不使用任何正则表达式。

根据documentation of str.partition -

  

在第一次出现sep时拆分字符串,并返回包含分隔符之前的部分的3元组,分隔符本身以及分隔符之后的部分。如果找不到分隔符,则返回一个包含字符串本身的3元组,后跟两个空字符串。

既然你说,你只想要1,你可以使用re.split()模块中的re方法,将maxsplit设置为str.partition,然后再进行第一次元素,应该等同于import re testString = 'Tre Bröders Väg 6 2tr' sep = '[0-9]tr' head = re.split(sep,testString,1)[0] 尝试的内容。示例 -

>>> import re
>>> testString = 'Tre Bröders Väg 6 2tr'
>>> sep = '[0-9]tr'
>>> head = re.split(sep,testString,1)[0]
>>> head
'Tre Bröders Väg 6 '

演示 -

(?:\\.|[^\\"])*

答案 1 :(得分:1)

普通re.split()方法

您可以使用 head 提取 re.split()

import re

testString = 'Tre Bröders Väg 6 2tr'
sep = r'[0-9]tr'  # "r" is essential here!
head, tail = re.split(sep, testString)
head.strip()
>>>'Tre Bröders Väg 6'

巧克力洒re.split()

如果你用 sep 捕获 ()re.split() 的行为就像一个伪 re.partition()(Python 中没有这样的方法,实际上......)

import re

testString = 'Tre Bröders Väg 6 2tr'
sep = r'([0-9]tr)'  # "()" added.
head, sep, tail = re.split(sep, testString)
head, sep, tail
>>>('Tre Bröders Väg 6 ', '2tr', '')

答案 2 :(得分:0)

对于仍在寻找如何进行正则表达式分区的答案的人,请尝试以下功能:

import regex # re also works

def regex_partition(content, separator):
    separator_match = regex.search(separator, content)
    if not separator_match:
        return content, '', ''

    matched_separator = separator_match.group(0)
    parts = regex.split(matched_separator, content, 1)

    return parts[0], matched_separator, parts[1]