Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:用包含子字符串的单词拆分字符串_Python_Regex_Python 3.x_String_Split - Fatal编程技术网

Python:用包含子字符串的单词拆分字符串

Python:用包含子字符串的单词拆分字符串,python,regex,python-3.x,string,split,Python,Regex,Python 3.x,String,Split,我有一个字符串text=“在两天内为我安排一个会议”。 我有一些单词的列表meetingStrings。 会议字符串中有“会议”。因此,我必须通过会议来分割文本 期望输出: 两天后 这将产生以下输出: 两天后就要开始了 使用re.split(): 印刷品: in 2 days 试试这个: 重新导入 text=“在2天内为我安排一次会议” 打印(re.split(“({})\\w*”.format(“|”。.join(meetingStrings)),text)[-1].strip() 输出

我有一个字符串
text=“在两天内为我安排一个会议”
。 我有一些单词的列表
meetingStrings
会议字符串中有“会议”
。因此,我必须通过会议来分割文本

期望输出:

两天后

这将产生以下输出:

两天后就要开始了

使用
re.split()

印刷品:

 in 2 days
试试这个:

重新导入
text=“在2天内为我安排一次会议”
打印(re.split(“({})\\w*”.format(“|”。.join(meetingStrings)),text)[-1].strip()

输出:
在2天内

只需对代码进行一点小更改:

meetingStrings = [
    "appointment",
    "meet",
    "interview"
]
text = "Fix me a meeting in 2 days"
for x in meetingStrings:
    if x in text.lower():
        txt = text.split(x, 1)[1]
        print(txt.split(" ", 1)[1]) #<--- Here
meetingStrings=[
“任命”,
“会面”,
“采访”
]
text=“在2天内为我安排一次会议”
对于MeetingString中的x:
如果text.lower()中有x:
txt=text.split(x,1)[1]

打印(txt.split(“,1)[1])#不带正则表达式,
str.partition
-ing:

for x in meetingStrings: 
    pre, _, post = text.lower().partition(x) 
    if post: 
        pre = pre.rpartition(' ')[0] if not pre.endswith(' ') else pre.rstrip() 
        post = post.partition(' ')[-1] if not post.startswith(' ') else post.lstrip() 
        print([pre, post]) 
示例:

In [35]: meetingStrings = [ 
    ...:     "appointment", 
    ...:     "meet", 
    ...:     "interview" 
    ...: ] 
    ...: text = "Fix me a meeting in 2 days" 

    ...: for x in meetingStrings: 
    ...:     pre, _, post = text.lower().partition(x) 
    ...:     if post: 
    ...:         pre = pre.rpartition(' ')[0] if not pre.endswith(' ') else pre.rstrip() 
    ...:         post = post.partition(' ')[-1] if not post.startswith(' ') else post.lstrip() 
    ...:         print([pre, post]) 
    ...:                                                                                                                                                                                                    
['fix me a', 'in 2 days']

试着这样做:

import re

meetingStrings = [
        "appointment",
        "meet",
        "interview"
]
text = "Fix me a meeting in 2 days"

def split_string(text, strings):
    search = re.compile('|'.join(strings))
    start = None
    input = text.split()
    for e, x in enumerate(input):
        if search.search(x):
            if start < e:
                yield ' '.join(input[start:e])
            start = None
        else:
            if start is None:
                start = e
    else:
        if start is not None:
            yield ' '.join(input[start:])

print(' '.join(split_string(text, meetingStrings)))
重新导入
会议字符串=[
“任命”,
“会面”,
“采访”
]
text=“在2天内为我安排一次会议”
def split_字符串(文本、字符串):
搜索=重新编译(“|”连接(字符串))
开始=无
输入=text.split()
对于枚举(输入)中的e,x:
如果搜索。搜索(x):
如果开始

这可能比其他答案要长,但似乎完全符合您的要求-在字符串上拆分,其中包含作为子字符串传递的字符串之一。

我有另一种更简单的方法,首先拆分句子中的所有单词,然后从出现
meetingStrings
的位置切掉句子:

l=text.split()
for i in meetingStrings:
    for idx, j in enumerate(l):
        if i in j:
            l=l[idx+1:] 
print(' '.join(l))
给出:

'in 2 days'
您只需使用find()和list slice:

text = "Fix me a meeting in 2 days"
meetingStrings = [
    "appointment",
    "meet",
    "interview"
]


sep = [i for i in meetingStrings if i in text]

idx = text.find(sep[0])
idx_ = text[idx:].find(' ')
print (text[idx+idx_:])
输出:

in 2 days

此表达式也可以与
i
标志一起使用:

(?:meet|interview|appointment)\S*\s+((?:in|after)\s[0-9]+\s+(?:days?|months?|weeks?|years?))
我们可以使用逻辑OR在非捕获组中包含我们可能需要的任何单词,例如:

(?:in|after|on|from)


试验 输出 如果要探索/简化/修改该表达式,请在的右上面板中进行说明

正则表达式电路 可视化正则表达式:


这是用于使用搜索的。
你所需要做的就是把文本放在单词的中间。 然后匹配单词

结果在捕获组1中

无空格修剪

\b\w*(?:约会|会面|面试)\w*\b(.*)

可读版本

 \b 
 \w* 
 (?:
      appointment
   |  meet
   |  interview
 )
 \w* 
 \b 
 ( .* )                        # (1)

带有空格修剪

(?m)\b\w*(?:约会|见面|面试)\w*\b[^\S\r\n]*(.*)[^\S\r\n]*$


此外,如果在任一正则表达式的开头添加一个
*


它总是会得到最后一个关键字。

Hi@Andrej谢谢你的回答,但我想要的输出是“2天内”。问题不太清楚,但我怀疑想要的输出是
['Fix me a','in 2 days']
,但这不包括
会议字符串
备选方案
(?:in|after|on|from)
(?:days?|months?|weeks?|years?|hours?)
(?:meet|interview|appointment|session|schedule)
import re

regex = r"(?:meet|interview|appointment)\S*\s+((?:in|after)\s[0-9]+\s+(?:days?|months?|weeks?|years?))"
test_str = "Fix me a meeting in 2 days meetings in 2 months meet in 1 week nomeeting in 2 days meet after 2 days"

print(re.findall(regex, test_str, re.IGNORECASE))
['in 2 days', 'in 2 months', 'in 1 week', 'in 2 days', 'after 2 days']
 \b 
 \w* 
 (?:
      appointment
   |  meet
   |  interview
 )
 \w* 
 \b 
 ( .* )                        # (1)