Python展望正则表达式

时间:2017-09-04 15:01:01

标签: python regex

s = u'A.anycontentfollowedbyB.anycontentanylengthC.anycontentD.anycontent'
ExpectResult = [u'A.anycontentfollowedby', u'B.anycontentanylength', u'C.anycontent', u'D.anycontent']

我有一个像这样的unicode str。我需要将这些选项分成四个不同的子串,这些子串以A.,B.,C.,D。开头(。不是点,它是一个特殊字符)。我怎样才能达到预期的效果?感谢大家!! ABCD选项来自多个选择题。最多四个选项没有EFGH ...等,但可能只有一两个选项,如A.or A.,B.together

5 个答案:

答案 0 :(得分:0)

你犯了一些错误。

您应该决定 - 您是否会使用正则表达式组进行阅读或拆分。你迷路了。

它是第一个变体 - 寻找你的特殊点。您应该使用您的特殊点,然后 - 正常点,后跟+ - 表示您正在寻找的字符串。

request = QtNetwork.QNetworkRequest(QtCore.QUrl(url))
header_data = QtCore.QByteArray('{}:{}'.format(
    credentials['username'], credentials['password'])).toBase64()
request.setRawHeader('Authorization', 'Basic {}'.format(header_data))
replies.append(manager.get(request))

如果您需要这些A.以及可以找到的东西,请使用:

A.(.+)B.(.+)C.(.+)D.(.+)  // read groups by that regex

,如果您需要这些(A..+)(B..+)(C..+)(D..+) or u'(A..+)',u'(B..+)',u'(C..+)',u'(D..+)' 构造。

如果第二种情况(分裂)是你需要的 - 你在分裂中的前瞻是毫无意义的。拆分子字符串的正则表达式应该更加简单:

u'...',

就是这样。真的,我不喜欢第二种变体,因为你无法确定你是不是正确地读取'[A-D].' // use your special dot here 这一行。你没有aaaB.bbbC.ccc就拥有了aaa子串。而在第一个变体中,您知道第一组来自A.,第二组来自B.等等。

答案 1 :(得分:0)

你不需要在这里向前看。 “+” - 必须转义,因为它是特殊符号:

>>> re.findall('[A-Z].\+\d', str)
['A.+4', 'B.+5', 'C.+6', 'D.+7']

并且不要将变量命名为“str”

更新#1: 最好在开始时澄清一切。所以,这是新的答案,更复杂(我首先只是为了理解和历史):

>>> s = u'A.anycontentfollowedbyB.anycontentanylengthC.anycontentD.anycontent'    
>>> re.findall('.+?(?=[A-D].|$)',s)
['A.anycontentfollowedby', 'B.anycontentanylength', 'C.anycontent', 'D.anycontent']

简要说明:

  • (?= [A-D]。| $) - 展望'A' 'B.'等等或行尾($)
  • 。+? - 在前瞻性比赛之前的任何符号,但不贪婪(?)。这意味着它会在第一场比赛之前找到,而不是直到最后一场比赛。

答案 2 :(得分:0)

你可以试试这个:

import re
s = u'A.+4B.+5C.+6D.+7'

data = [i for i in re.findall('.{4}', s)]

输出:

[u'A\uff0e+4', u'B\uff0e+5', u'C\uff0e+6', u'D\uff0e+7']

答案 3 :(得分:0)

首先请注意,字符串中的'.'是一个代码点。你想的不是两个ascii字符:

s = u'A.+4B.+5C.+6D.+7'
print repr(s)
# u'A\uff0e+4B\uff0e+5C\uff0e+6D\uff0e+7'

在构建模式时应考虑这一点:

pattern = ur'[^\d]+.\+\d'
print repr(pattern)
# u'[^\\d]+\uff0e\\+\\d'

此外,你在前瞻之前拆分角色,这样除了你使用分组的parens之外,这个角色不会被包含在分割中,但是这个角色在结果中是分开的。 re.split。您最好使用re.findall

print re.findall(pattern, s)
# [u'A\uff0e+4', u'B\uff0e+5', u'C\uff0e+6', u'D\uff0e+7']

答案 4 :(得分:0)

我确信会有比我在这里编码更好的选项,但它会给你一些解决问题的提示。

您有两种方法可以获得所需的结果。假设您的测试字符串

1)使用re.findall

result = re.findall(r"([a-d].*?\d)", data, re.IGNORECASE)
print(result)

2)通过拆分字符串

import re
data = r"A. +4B.+5C.+6D.+7"
result = [x for x in re.split(r"([a-d].*?\d)", data, 0, re.IGNORECASE) if x != '']
print(result)

输出为['A. +4', 'B.+5', 'C.+6', 'D.+7']

查看repl.it

的实时演示