// include the latest version of the regex crate in your Cargo.toml
extern crate regex;
use regex::Regex;
fn main() {
let regex = Regex::new(r"(?mx)^from\s+
(?P<package_name>[.\w]+)\s+
import\s+
(\()?
(?(2)
(?P<object>[^()]+)\)
|
(?P<object2>(?:.+[\n\r]?)+)
)").unwrap();
let string = "from .sql.base import (
SchemaVisitor
)
import os # ignore this import
from _pytest.config import (
main, UsageError, cmdline,
hookspec, hookimpl
)
I can capture this with:
syntax1 = re.compile(r'^ *from (?P<package>[.\\w]+) +import +\\(?(?P<objects>[*, \\n\\w]+)\\)? *$',
flags=re.MULTILINE)
Syntax #2 uses line continutation (if needed), and technically has no newlines within the import statement:
from pandas import Series
from .solvers import solve, solve_linear_system, solve_linear_system_LU, \\
solve_undetermined_coeffs, nsolve, solve_linear, checksol, \\
det_quick, inv_quick, check_assumptions
from .ode import checkodesol, classify_ode, dsolve, \\
homogeneous_order";
// result will be an iterator over tuples containing the start and end indices for each match in the string
let result = regex.captures_iter(string);
for mat in result {
println!("{:?}", mat);
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Rust, please visit: https://docs.rs/regex/latest/regex/