我想匹配只有一个搜索词的字符串(这只是我示例中的第一个字符串)。包含多个搜索字词的字符串以+
符号分隔:
jobs?search=term1&location=&distance=10+page=2
jobs?search=term1+term2&location=ca&distance=30
jobs?search=term1+term2+term3&location=nyc&distance=25
我的想法是匹配任何单词(前面有search=
)不是后跟+
,但是后跟&
:
search=.*?[^+]&
但它不太有效并且用多个术语捕获字符串。
答案 0 :(得分:1)
您需要使用
[&?]search=([^&+]+)(?=&|$)
请参阅regex demo
它将匹配:
[&?]
- ?
或&
(以确保search
是整个密钥名称)search=
- 文字子字符串([^&+]+)
- 第1组捕获+
和&
以外的1 +个符号(?=&|$)
- 需要&
或字符串结尾的前瞻,在前一个子模式捕获的最后一个符号后立即显示(注意它可以替换为非捕获组,{{1 },该值仍将在Group 1中。(?:&|$)
import re
ss = ['jobs?search=term1&location=&distance=10+page=2','jobs?search=term1+term2&location=ca&distance=30','jobs?search=term1+term2+term3&location=nyc&distance=25']
rx = re.compile(r'[&?]search=([^&+]+)(?=&|$)')
for s in ss:
m = rx.search(s)
if m:
print("{}: {}".format(s, m.group(1)))
...或使用R stringr :
ss <- c('jobs?search=term1&location=&distance=10+page=2','jobs?search=term1+term2&location=ca&distance=30','jobs?search=term1+term2+term3&location=nyc&distance=25')
results <- regmatches(ss, regexec("[&?]search=([^&+]+)(?:&|$)",ss))
unlist(results)[2]
答案 1 :(得分:1)
如果您只想捕获术语而不是前面的search=
:
(?<=search=)[^+]*?(?=&|$)
(?<=search=)
- 确保搜索=在术语[^+]*?
- 匹配该字词(确保它不包含任何+)。这是一个非贪婪的匹配(使用*?
),以便第一次出现&amp;原理(?=&|$)
- 确保术语后跟&
或字符串结尾($
)