regex to find all words after specific word?
<p>I have a string like below:</p>

<pre><code>Features:  -Includes hanging accessories.  -Artist: William-Adolphe Bouguereau.  -Made with 100pct cotton canvas.  -100pct Anti-shrink pine wood bars and Epson anti-fade ultra chrome inks.  -100pct Hand-made and inspected in the U.S.A.  -Orientation: Horizontal.  **Subject: -Figures/Nautical and beach.**  Gender: -Unisex/Both.  Size: -Mini 17'' and under/Small 18''-24''/Medium 25''-32''/Large 33''-40''/Oversized 41'' and above.  Style: -Fine art.  Color: -Blue.  Country of Manufacture: -United States.  Product Type: -Print of painting.  Region: -Europe.  Primary Art Material: -Canvas. Dimensions:  -8'' H x 12'' W x 0.75'' D: 0.72 lb.  -12'' H x 18'' W x 0.75'' D: 1.14 lbs.  -12'' H x 18'' W x 1.5'' D: 2.45 lbs.  -18'' H x 26'' W x 0.75'' D: 1.44 lbs.  Paintings Prints Tori White Wildon Photography Photos Posters Abstract Black D cor Designs Framed Hazelwood Hokku Home Landscape Oil Accent 075 12 15 18 26 40 60 8 D H W x 1 1017 1824 2532 holidays, christmas gift gifts for girls boys
</code></pre>

<p>I have to find the words after particular word.  </p>

<p>I want to extract the words after the word <code>"Subject"</code> in above example.</p>

<p>The output should be like below:</p>

<pre><code>Subject: -Figures/Nautical and beach.
</code></pre>

<p>I tried below regex:</p>

<pre><code>re.compile('(?&lt;=subject)(.{30}(?:\s|.))',re.I)
</code></pre>

<p>But there is not fixed number of words after subject keyword to specify so I can't specify exact number of words.</p>

<p>How do I stop at "peroid" or space.There is no specific stopping criterion.</p>

<p>Your <code>(?&lt;=subject)(.{30}(?:\s|.))</code> regex asserts the position after <code>subject</code>. then grabs 30 characters other than a linebreak symbol and then matches either a whitespace or any character but a linebreak symbol. This does not really fit your requirements as the substring can be of any length.</p>

<p>You may use alternation based regex with a capturing group:</p>

<pre><code>subject:\s*([^.]+|\S+)
</code></pre>

<p>See the <a href="https://regex101.com/r/aC3pC1/1" rel="nofollow">regex demo</a></p>

<p><strong>Details</strong>:</p>

<ul>
<li><code>subject:</code> - literal <code>subject:</code> string</li>
<li><code>\s*</code> - 0+ whitespaces</li>
<li><code>([^.]+|\S+)</code> - Group 1 capturing 1 or more non-period symbols or 1+ non-whitespace symbols</li>
</ul>

<p><strong>Note</strong>: the order of the alternatives <em>matters</em> here since <code>[^.]+</code> matches spaces, and <code>\S+</code> does not. If the substring after <code>\s*</code> starts with a dot, the <code>\S+</code> will match that substring up to a whitespace.</p>

<p><a href="https://ideone.com/JRe3y9" rel="nofollow">Python demo</a>:</p>

<pre><code>import re
p = re.compile(r'subject:\s*([^.]+|\S+)', re.IGNORECASE)
s = "Features:  -Includes hanging accessories.  -Artist: William-Adolphe Bouguereau.  -Made with 100pct cotton canvas.  -100pct Anti-shrink pine wood bars and Epson anti-fade ultra chrome inks.  -100pct Hand-made and inspected in the U.S.A.  -Orientation: Horizontal.  **Subject: -Figures/Nautical and beach.**  Gender: -Unisex/Both.  Size: -Mini 17'' and under/Small 18''-24''/Medium 25''-32''/Large 33''-40''/Oversized 41'' and above.  Style: -Fine art.  Color: -Blue.  Country of Manufacture: -United States.  Product Type: -Print of painting.  Region: -Europe.  Primary Art Material: -Canvas. Dimensions:  -8'' H x 12'' W x 0.75'' D: 0.72 lb.  -12'' H x 18'' W x 0.75'' D: 1.14 lbs.  -12'' H x 18'' W x 1.5'' D: 2.45 lbs.  -18'' H x 26'' W x 0.75'' D: 1.44 lbs.  Paintings Prints Tori White Wildon Photography Photos Posters Abstract Black D cor Designs Framed Hazelwood Hokku Home Landscape Oil Accent 075 12 15 18 26 40 60 8 D H W x 1 1017 1824 2532 holidays, christmas gift gifts for girls boys"
m = p.search(s)
if m:
    print(m.group())    # this includes Subject: 
    print(m.group(1))   # this does not include Subject: 
</code></pre>

python regex python-3.x pattern-matching