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
答案 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']
简要说明:
答案 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
的实时演示