How to output all unassigned strings in a python file
<p>I have a python file (a script) that looks like this:</p>

<h3>script.py</h3>

<pre><code>"""
Multiline comment with unique
text pertaining to the Foo class
"""
class Foo():
    pass


"""
Multiline comment with unique
text pertaining to the Bar class
"""
class Bar():
    pass


"""
Multiline comment with unique
text pertaining to the FooBar class
"""
class FooBar():
    pass


def print_comments():
    # NotImplementedError 
</code></pre>

<p>Is there some way for <code>print_comments</code> to detect and output all the unassigned strings so I could see this:</p>

<blockquote>
  <p>Multiline comment with unique
      text pertaining to the Foo class</p>
  
  <p>Multiline comment with unique
      text pertaining to the Bar class</p>
  
  <p>Multiline comment with unique
      text pertaining to the FooBar class</p>
</blockquote>

<p>Using regex:</p>

<pre><code>$ cat script.py
from __future__ import print_function
import sys, re

"""
Multiline comment with unique
text pertaining to the Foo class
"""
class Foo():
    pass


"""
Multiline comment with unique
text pertaining to the Bar class
"""
class Bar():
    pass


"""
Multiline comment with unique
text pertaining to the FooBar class
"""
class FooBar():
    pass

def print_comments():
    with open(sys.argv[0]) as f:
        file_contents = f.read()

    map(print, re.findall(r'"""\n([^"""]*)"""', file_contents, re.S))

print_comments()
$ python script.py
Multiline comment with unique
text pertaining to the Foo class

Multiline comment with unique
text pertaining to the Bar class

Multiline comment with unique
text pertaining to the FooBar class
</code></pre>

<p>Regex Explanation:</p>

<pre><code>"""\n([^"""]*)"""
</code></pre>

<p><img src="https://www.debuggex.com/i/ADIqnLkWvzSG2UzQ.png" alt="Regular expression visualization"></p>

<p><a href="https://www.debuggex.com/r/ADIqnLkWvzSG2UzQ" rel="nofollow">Debuggex Demo</a></p>

<p>The ideal way to do this would be to use the ast module, parse the entire document and then print call ast.get_docstring on all nodes of type ast.FunctionDef, ast.ClassDef or ast.Module. However, your comments are not docstrings. If the file would have been something like this:</p>

<pre><code>$ cat script.py

import sys, re, ast

class Foo():
    """
    Multiline comment with unique
    text pertaining to the Foo class
    """
    pass


class Bar():
    """
    Multiline comment with unique
    text pertaining to the Bar class
    """
    pass


class FooBar():
    """
    Multiline comment with unique
    text pertaining to the FooBar class
    """
    pass

def print_docstrings():
    with open(sys.argv[0]) as f:
        file_contents = f.read()

    tree = ast.parse(file_contents)
    class_nodes = filter((lambda x: type(x) in [ast.ClassDef, ast.FunctionDef, ast.Module]), ast.walk(tree))
    for node in class_nodes:
        doc_str = ast.get_docstring(node)
        if doc_str:
            print doc_str

print_docstrings()

$ python script.py
Multiline comment with unique
text pertaining to the Foo class
Multiline comment with unique
text pertaining to the Bar class
Multiline comment with unique
text pertaining to the FooBar class
</code></pre>

python string unassigned-variable