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)