Python 字符串以逗号分隔,但带有条件(忽略逗号分隔的单个单词)

Python 字符串以逗号分隔,但带有条件(忽略逗号分隔的单个单词),python,regex,Python,Regex,下面的代码有点混乱,我承认我用逗号分隔字符串,但条件是当字符串包含逗号分隔的单个单词时,它不会分隔,例如: 它并没有分开是的,你想在高潮后几分钟上床睡觉是有原因的,但它分开了心率的增加,这是你从手淫中得到的,直接有利于血液循环,并且可以降低心脏病发作的可能性[“心率的增加”,“你从手淫中得到的”,“直接有益于血液循环”,“可以降低心脏病发作的可能性”] 问题是,当密码遇到这样的字符串时,它的目的就失败了:当男人射精时,它会释放出大量的化学物质,包括催产素、加压素和催乳素,所有这些都会自然地帮助你

下面的代码有点混乱,我承认我用逗号分隔字符串,但条件是当字符串包含逗号分隔的单个单词时,它不会分隔,例如: 它并没有分开是的,你想在高潮后几分钟上床睡觉是有原因的,但它分开了心率的增加,这是你从手淫中得到的,直接有利于血液循环,并且可以降低心脏病发作的可能性[“心率的增加”,“你从手淫中得到的”,“直接有益于血液循环”,“可以降低心脏病发作的可能性”]

问题是,当密码遇到这样的字符串时,它的目的就失败了:当男人射精时,它会释放出大量的化学物质,包括催产素、加压素和催乳素,所有这些都会自然地帮助你入睡。我不想在催产素之后分离,而是在催乳素之后。我需要一个正则表达式来做到这一点

import os
import textwrap
import re
import io
from textblob import TextBlob


string = str(input_string)

listy= [x.strip() for x in string.split(',')]
listy = [x.replace('\n', '') for x in listy]
listy = [re.sub('(?<!\d)\.(?!\d)', '', x) for x in listy]
listy = filter(None, listy) # Remove any empty strings    

newstring= []

for segment in listy:

    wc = TextBlob(segment).word_counts

    if listy[len(listy)-1] != segment:

        if len(wc) > 3:  # len(segment.split(' ')) > 7:
            newstring.append(segment+"&&")
        else:
            newstring.append(segment+",")

    else:

        newstring.append(segment)

sep = [x.strip() for x in (' '.join(newstring)).split('&&')]
考虑一下下面的问题

mystr="When men ejaculate, it releases a slew of chemicals including oxytocin, vasopressin, and prolactin, all of which naturally help you hit the pillow."

rExp=r",(?!\s+(?:and\s+)?\w+,)"
mylst=re.compile(rExp).split(mystr)
print(mylst)
应给出以下输出

['When men ejaculate', ' it releases a slew of chemicals including oxytocin, vasopressin, and prolactin', ' all of which naturally help you hit the pillow.']
让我们看看我们是如何分割字符串的

使用每个逗号,后面不跟“?”->“负向前看”\s+\w+、空格和带逗号的单词。 在血管加压素的情况下,上述操作将失败,并且as和后面不跟,。因此在中引入条件and\s+

虽然我可能想使用下面的

测试正则表达式 测试代码

本质上考虑替换你的线


虽然我相信正确的英语用法是a、b和c,而不是a、b和c。因此,如果使用正确的英语,那么只使用“!\s+\w+”就可以了。回答得很好。@bulbus实际上要么是正确的,第二种方法是有争议的,因为它减少了歧义
,(?!\s+\w+,)
,(?!\s+(?:and\s+)?\w+,)
,(?!\s+(?:(?:and|or)\s+)?\w+,)
listy= [x.strip() for x in string.split(',')]
listy= [x.strip() for x in re.split(r",(?!\s+(?:and\s+)?\w+,)",string)]